Elegante Art und Weise zu speichern Wörterbuch dauerhaft mit Python?
Derzeit teuer analysieren einer Datei, die erzeugt ein dictionary von ~400 Schlüssel-Wert-Paaren, die nur selten aktualisiert. Zuvor hatten Sie eine Funktion, die analysiert die Datei, schrieb es in eine text-Datei in dictionary syntax (dh. dict = {'Adam': 'Room 430', 'Bob': 'Room 404'}
) etc, und kopierte und klebte es in eine andere Funktion, deren einziger Zweck es war, um zurückzukehren, analysiert Wörterbuch.
Daher in jeder Datei, wo ich Sie benutzen das Wörterbuch, ich würde import-Funktion, und es einer Variablen zuweisen, die jetzt das Wörterbuch. Frage mich, ob es ein eleganter Weg, dies zu tun, die sich nicht um ausdrücklich das kopieren und einfügen von code um? Mit Hilfe einer Datenbank Art scheint überflüssig, und die text-Datei gab mir den Vorteil, zu sehen, ob die Analyse korrekt ausgeführt wurde, bevor Sie es an die Funktion. Aber ich bin offen für Vorschläge.
InformationsquelleAutor der Frage zhuyxn | 2012-08-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nicht dump es zu einer JSON-Datei laden und dann von dort, wo Sie es brauchen?
Laden von JSON ist relativ effizient.
Andere Möglichkeit wäre die Verwendung von
Gurke
aber im Gegensatz zu JSON-Dateien, die es erzeugt nicht lesbare so verlieren Sie sich auf der visuellen überprüfung, die Sie gern von Ihrem alten Methode.InformationsquelleAutor der Antwort Amber
Warum Durcheinander mit all diesen Serialisierung Methoden? Es ist bereits in eine Datei geschrieben werden als Python-dict (obwohl mit dem unglücklichen Namen 'dict'). Ändern Sie Ihr Programm zu schreiben, das Daten mit einer besseren variable name - vielleicht ist 'Daten', oder 'Katalog', und speichern Sie die Datei als Python-Datei, sagen data.py. Dann können Sie einfach importieren Sie die Daten direkt zur Laufzeit, ohne plump zu kopieren/einfügen oder JSON/Regal/etc. Analyse:
InformationsquelleAutor der Antwort PaulMcG
JSON ist wahrscheinlich der richtige Weg zu gehen in vielen Fällen; aber es könnte eine alternative sein. Es sieht aus wie Ihre Schlüssel und Ihre Werte sind immer strings, ist das richtig? Sie sollten erwägen, mit
dbm
/anydbm
. Diese sind "Datenbanken", aber Sie handeln fast genau wie Wörterbücher. Sie sind ideal für die günstigen Daten-Persistenz.InformationsquelleAutor der Antwort senderle
Wenn die keys sind alle Zeichenfolgen, die Sie verwenden können, die Regal Modul
json
wäre eine gute Wahl, wenn Sie brauchen, um die Nutzung von Daten aus anderen SprachenInformationsquelleAutor der Antwort John La Rooy
Wenn storage-Effizienz ankommt, verwenden Gurke oder CPickle(für Ausführung performance-Gewinn). Als Bernstein wies darauf hin, Sie können auch dump/load per Json. Es wird für Menschen lesbar, benötigt aber mehr Festplattenspeicher.
InformationsquelleAutor der Antwort luanjunyi
Schlage ich vor, Sie überlegen, mit Hilfe der
shelve
Modul, da Ihre Daten-Struktur ist eine Zuordnung.Das war mein Antwort auf eine ähnliche Frage mit dem Titel Wenn ich will erstellen Sie eine benutzerdefinierte Datenbank, wie könnte ich? Es ist auch ein bisschen Beispielcode in einem anderen Antwort von mir, für dessen Verwendung für die Frage Wie man eine Objekt-Datenbank?
ActiveState hat eine hoch bewertet PersistentDict Rezept, das unterstützt csv -, json und pickle Ausgabe-Datei-Formate. Es ist ziemlich schnell, da alle drei Formate implementieren Sie in C (obwohl das Rezept an sich ist reines Python), so dass die Tatsache, dass er liest die gesamte Datei in den Speicher, wenn es geöffnet wird, kann hingenommen werden.
InformationsquelleAutor der Antwort martineau
den JSON-Richtung gibt es auch etwas namens simpleJSON. Mein erstes mal mit json in python-json-Bibliothek funktionierte nicht für mich/ich konnte nicht es herausfinden. simpleJSON war...einfacher zu bedienen
InformationsquelleAutor der Antwort Tom
JSON (oder YAML oder was auch immer) serialisieren ist wahrscheinlich besser, aber wenn Sie schon schreiben das Wörterbuch, um einen text-Datei in der python-syntax, komplett mit den Namen einer Variablen Bindung, man könnte einfach schreiben, dass eine .py-Datei statt. Dann, dass die python-Datei importierbar und nutzbar ist. Es gibt keine Notwendigkeit für die "Funktion gibt ein Wörterbuch" - Ansatz, da kann man direkt verwenden Sie es als ein global in der Datei. z.B.
statt:
Der einzige Unterschied ist, dass
manually_copied.get_dict
gibt Sie eine neue Kopie von das Wörterbuch jedes mal, wenn, in der Erwägung, dassgenerated.please_dont_use_dict_as_a_variable_name
[1] ist ein gemeinsames Objekt. Dies kann von Bedeutung sein, wenn Sie ändern Sie das Wörterbuch in das Programm nach abrufen, aber Sie können immer mitcopy.copy
odercopy.deepcopy
zum erstellen einer neuen Kopie, wenn Sie brauchen, um zu ändern, eine unabhängig von den anderen.[1]
dict
list
str
int
map
etc sind allgemein betrachtet als schlechte Variablennamen. Der Grund dafür ist, dass diese bereits definiert sind als built-ins, und werden sehr Häufig verwendet. Also, wenn Sie etwas geben Sie einen Namen wie, dass, zumindest es zu kognitiver Dissonanz für die Leute Lesen Ihren code (einschließlich, nachdem du Weg warst für eine Weile), denn Sie müssen im Hinterkopf behalten, dass "dict
bedeutet nicht, was es normalerweise nicht hier". Es ist auch Recht wahrscheinlich, dass an irgendeinem Punkt werden Sie Holen Sie sich ein ärgerlich-zu-lösen, bug-reporting, diedict
Objekte sind nicht aufrufbar (oder so), weil einige Stück code versucht, mit dem Typdict
aber immer ist das dictionary-Objekt verbunden sind, auf den Namendict
statt.InformationsquelleAutor der Antwort Ben