Ich versuche, ein Wörterbuch in eine txt-Datei zu schreiben. Lesen Sie dann die Diktatwerte, indem Sie die Tasten mit eingeben raw_input
. Ich habe das Gefühl, dass mir nur ein Schritt fehlt, aber ich habe jetzt schon eine Weile gesucht.
Ich bekomme diesen Fehler
File "name.py", line 24, in reading
print whip[name]
TypeError: string indices must be integers, not str
Mein Code:
#!/usr/bin/env python
from sys import exit
class Person(object):
def __init__(self):
self.name = ""
self.address = ""
self.phone = ""
self.age = ""
self.whip = {}
def writing(self):
self.whip[p.name] = p.age, p.address, p.phone
target = open('deed.txt', 'a')
target.write(str(self.whip))
print self.whip
def reading(self):
self.whip = open('deed.txt', 'r').read()
name = raw_input("> ")
if name in self.whip:
print self.whip[name]
p = Person()
while True:
print "Type:\n\t*read to read data base\n\t*write to write to data base\n\t*exit to exit"
action = raw_input("\n> ")
if "write" in action:
p.name = raw_input("Name?\n> ")
p.phone = raw_input("Phone Number?\n> ")
p.age = raw_input("Age?\n> ")
p.address = raw_input("Address?\n>")
p.writing()
elif "read" in action:
p.reading()
elif "exit" in action:
exit(0)
name 'p' is not defined
, p sollte eine Instanz der Personenklasse seinAntworten:
Ihr Code ist fast richtig ! Sie haben Recht, Sie verpassen nur einen Schritt. Wenn Sie die Datei einlesen, lesen Sie sie als Zeichenfolge. Sie möchten die Zeichenfolge jedoch wieder in ein Wörterbuch umwandeln.
Die Fehlermeldung, die Sie gesehen haben, war, weil
self.whip
es sich um eine Zeichenfolge und nicht um ein Wörterbuch handelte.Ich habe zuerst geschrieben, dass man den String einfach einspeisen kann,
dict()
aber das funktioniert nicht! Sie müssen etwas anderes tun.Beispiel
Hier ist der einfachste Weg: Führen Sie den String ein
eval()
. Wie so:Sie können es in einer Zeile tun, aber ich denke, es sieht auf diese Weise chaotisch aus:
Wird
eval()
aber manchmal nicht empfohlen. Das Problem ist, dass jede Zeichenfolgeeval()
ausgewertet wird. Wenn Sie jemand dazu verleitet hat, eine wirklich schwierige Zeichenfolge auszuführen, kann etwas Schlimmes passieren. In diesem Fall führen Sie nur Ihre eigene Datei aus, daher sollte dies in Ordnung sein.eval()
Aber weil
eval()
es nützlich ist, hat jemand eine Alternative dazu gemacht, die sicherer ist. Dies wird aufgerufenliteral_eval
und Sie erhalten es von einem Python-Modul namensast
.ast.literal_eval()
Es werden nur Zeichenfolgen ausgewertet, die sich in die grundlegenden Python-Typen verwandeln. Es gibt also keine Möglichkeit, dass eine knifflige Zeichenfolge auf Ihrem Computer etwas Schlechtes bewirken kann.BEARBEITEN
In Python empfiehlt es sich, eine
with
Anweisung zu verwenden, um sicherzustellen, dass die Datei ordnungsgemäß geschlossen wird. Schreiben Sie das Obige neu, um einewith
Anweisung zu verwenden:Im beliebtesten Python, bekannt als "CPython", benötigen Sie die
with
Anweisung normalerweise nicht , da die integrierten Funktionen "Garbage Collection" feststellen, dass Sie mit der Datei fertig sind, und sie für Sie schließen. Andere Python-Implementierungen wie "Jython" (Python für die Java-VM) oder "PyPy" (ein wirklich cooles experimentelles System mit Just-in-Time-Code-Optimierung) können die Datei möglicherweise nicht für Sie schließen. Es ist gut, sich daran zu gewöhnenwith
, und ich denke, es macht den Code ziemlich einfach zu verstehen.quelle
dict()
erwartet ein Wörterbuch oder eine Liste von Tupeln. Es wird keine Zeichenfolge ausgewertet.Haben Sie das JSON-Modul ausprobiert ? Das JSON-Format ist dem Python-Wörterbuch sehr ähnlich. Und es ist menschlich lesbar / beschreibbar:
Dieser Code wird in eine Textdatei geschrieben
Sie können auch aus einer JSON-Datei laden:
quelle
with
Anweisung öffnen, um sicherzustellen, dass sie danach geschlossen wird?d = {"one": {"1" : 1, "a": {"i"}}}
. B. mit verschachtelten Sollwerten (z . B. ). Daher empfehle ich die Pickle-Methode von @ blender, die in meinem Fall funktioniert.json.dump({1: 'one'}, file)
wie{'1': 'one'}
bei json.load zurückgelesen. Verwenden Sie Pickle besser, wenn Sie die gespeicherte Datei nicht in anderen Sprachen als Python lesen möchten.Verwenden Sie das
pickle
Modul, um Python-Objekte in Dateien zu speichern :Beachten Sie, dass ich nie eine Datei festgelegt
b = a
, sonderna
in eine Datei eingelegt und sie dann aufgehoben habeb
.Wie für Ihren Fehler:
self.whip
war ein Wörterbuchobjekt.deed.txt
Enthält Text. Wenn Sie also den Inhalt vondeed.txt
in ladenself.whip
,self.whip
wird dies zur Zeichenfolgendarstellung von sich selbst.Sie möchten den String wahrscheinlich wieder in ein Python-Objekt auswerten:
Beachten Sie, wie sich das
eval
anhörtevil
. Das ist beabsichtigt. Verwenden Siepickle
stattdessen das Modul.quelle
Ich habe meine eigenen Funktionen erstellt, die wirklich gut funktionieren:
Der Keyname wird zuerst gespeichert, gefolgt von allen Werten. Beachten Sie, dass mein Diktat in diesem Fall Ganzzahlen enthält, weshalb es in konvertiert wird
int
. Dies ist höchstwahrscheinlich der Teil, den Sie für Ihre Situation ändern müssen.quelle
Hallo, es gibt eine Möglichkeit, das Wörterbuch in eine Datei zu schreiben und zu lesen. Sie können Ihr Wörterbuch in das JSON-Format umwandeln und schnell lesen und schreiben.
So schreiben Sie Ihr Datum:
und um Ihre Daten zu lesen :
quelle
Sie können das Schlüssel-Wert-Paar durchlaufen und in eine Datei schreiben
quelle