2012-08-06 10 views
14

Zur Zeit aufwendig analysieren eine Datei, die ein Wörterbuch von ~ 400 Schlüssel, Wert-Paare generiert, die selten aktualisiert wird. Zuvor hatte eine Funktion, die die Datei analysierte, sie in eine Textdatei in Dictionary-Syntax (dh dict = {'Adam': 'Room 430', 'Bob': 'Room 404'}) usw. geschrieben und kopiert und in eine andere Funktion eingefügt, deren einziger Zweck es war, das geparste Dictionary zurückzugeben.Elegante Möglichkeit, Wörterbuch dauerhaft mit Python zu speichern?

Daher würde ich in jeder Datei, in der ich dieses Wörterbuch verwenden würde, diese Funktion importieren und sie einer Variablen zuweisen, die jetzt dieses Wörterbuch ist. Sie fragen sich, ob es einen eleganteren Weg gibt, dies zu tun, der nicht explizit das Kopieren und Einfügen von Code beinhaltet? Die Verwendung einer Datenbank scheint unnötig zu sein, und die Textdatei bot mir den Vorteil, zu sehen, ob das Parsen korrekt durchgeführt wurde, bevor es der Funktion hinzugefügt wurde. Aber ich bin offen für Vorschläge.

+0

Mögliche Duplizieren: http://stackoverflow.com/questions/7100125/storing-python-dictionaries –

+0

zu Json serialisiert, schreiben json in eine Datei, eine Datei lesen, 'json.loads()' danach? – favoretti

+0

Siehe auch: [So speichern Sie ein Wörterbuch in Python in einer Datei?] (Http://stackoverflow.com/q/19201290/562769) und [Speichern von Python-Wörterbüchern] (http://stackoverflow.com/q/7100125/562769). –

Antwort

33

Warum nicht es in eine JSON-Datei ablegen und dann von dort laden, wo Sie es brauchen?

import json 

with open('my_dict.json', 'w') as f: 
    json.dump(my_dict, f) 

# elsewhere... 

with open('my_dict.json') as f: 
    my_dict = json.load(f) 

Laden von JSON ist ziemlich effizient. Eine andere Option wäre die Verwendung von pickle, aber im Gegensatz zu JSON sind die erzeugten Dateien nicht von Menschen lesbar, so dass Sie die visuelle Verifizierung Ihrer alten Methode verlieren.

3

Wenn die Speichereffizienz von Bedeutung ist, verwenden Sie Pickle oder CPickle (zur Steigerung der Ausführungsleistung). Wie Amber sagte, können Sie auch über Json dump/load. Es wird für Menschen lesbar sein, benötigt aber mehr Festplatten.

4

JSON ist wahrscheinlich in vielen Fällen der richtige Weg; aber es könnte eine Alternative geben. Es sieht so aus, als ob deine Schlüssel und deine Werte immer Zeichenfolgen sind, ist das richtig? Sie könnten die Verwendung von dbm/anydbm in Erwägung ziehen. Dies sind "Datenbanken", aber sie verhalten sich fast genau wie Wörterbücher. Sie eignen sich hervorragend für preiswerte Datenpersistenz.

>>> import anydbm 
>>> dict_of_strings = anydbm.open('data', 'c') 
>>> dict_of_strings['foo'] = 'bar' 
>>> dict_of_strings.close() 
>>> dict_of_strings = anydbm.open('data') 
>>> dict_of_strings['foo'] 
'bar' 
4

Wenn die Schlüssel alle Saiten sind, können Sie das shelve Modul verwenden

A shelf ist ein hartnäckiges, Wörterbuch-ähnliches Objekt. Der Unterschied zu "dbm" -Datenbanken besteht darin, dass die Werte (nicht die Schlüssel!) In einem Shelf im Wesentlichen beliebige Python-Objekte sein können - alles, was das Pickle-Modul verarbeiten kann. Dazu gehören die meisten Klasseninstanzen, rekursive Datentypen, und Objekte mit vielen gemeinsamen Unterobjekten. Die Schlüssel sind gewöhnliche Zeichenfolgen.

json wäre eine gute Wahl sein, wenn Sie die Daten aus anderen Sprachen

+0

Ich habe auch Dinge gelesen, die mich glauben machen, dass 'Regal'-Dateien nicht plattformübergreifend kompatibel sind, da die zugrunde liegende Datenbank von einer zur anderen abweichen kann (und es gibt keine gute Möglichkeit, sie zu kontrollieren). – martineau

2

ich verwenden müssen, schlagen Sie das shelve Modul betrachten verwenden, da Ihre Datenstruktur eine Abbildung ist. Das war mein answer auf eine ähnliche Frage If I want to build a custom database, how could I? den Titel Es ist auch ein bisschen von Beispielcode in einer anderen answer von mir seine Verwendung für die How to get a object database?

Activestate hat ein hoch bewertet PersistentDict Rezept Frage zu fördern, die csv, json unterstützt, und Gurke Ausgang Dateiformate. Es ist ziemlich schnell, da alle drei dieser Formate in C implementiert sind (obwohl das Rezept selbst reines Python ist), daher kann die Tatsache, dass es die ganze Datei in den Speicher liest, wenn es geöffnet wird, akzeptabel sein.

0

auf der JSON-Richtung gibt es auch etwas namens SimpleJSON. Mein erstes Mal mit Json in Python die JSON-Bibliothek funktionierte nicht für mich/ich konnte es nicht herausfinden. simpleJSON war ... einfacher zu verwenden

0

JSON (oder YAML, oder was auch immer) Serialisierung ist wahrscheinlich besser, aber wenn Sie bereits das Wörterbuch in eine Textdatei in Python-Syntax schreiben, mit einem variablen Namen binden Sie abzuschließen könnte das stattdessen in eine .py-Datei schreiben. Dann wäre diese Python-Datei importierbar und nutzbar wie sie ist. Es gibt keine Notwendigkeit für die "Funktion, die ein Wörterbuch zurückgibt" -Ansatz, da Sie es direkt als Global in dieser Datei verwenden können. z.B.

# generated.py 
please_dont_use_dict_as_a_variable_name = {'Adam': 'Room 430', 'Bob': 'Room 404'} 

statt:

# manually_copied.py 
def get_dict(): 
    return {'Adam': 'Room 430', 'Bob': 'Room 404'} 

Der einzige Unterschied besteht darin, dass manually_copied.get_dict gibt Ihnen eine neue Kopie des Wörterbuchs jedes Mal, während generated.please_dont_use_dict_as_a_variable_name [1] ein einziges gemeinsames Objekt ist. Dies kann von Bedeutung sein, wenn Sie das Wörterbuch in Ihrem Programm nach dem Abrufen ändern, aber Sie können immer copy.copy oder copy.deepcopy verwenden, um eine neue Kopie zu erstellen, wenn Sie eine unabhängig von den anderen ändern müssen.


[1] dict, list, str, int, map, etc. werden als schlechte Variablennamen im Allgemeinen betrachtet. Der Grund dafür ist, dass diese bereits als "Built-Ins" definiert sind und sehr häufig verwendet werden. Wenn Sie also etwas so benennen, wird es zumindest für Personen, die Ihren Code lesen (einschließlich Ihnen, nachdem Sie eine Weile weg waren), zu einer kognitiven Dissonanz führen, da sie sich merken müssen, dass "dict doesn ' Ich meine, was es hier normalerweise macht ". Es ist auch ziemlich wahrscheinlich, dass Sie zu einem Zeitpunkt einen ärgerlich-zu-lösen-Fehler melden, dass dict Objekte nicht aufrufbar sind (oder etwas), weil ein Stück Code versucht, den Typdict zu verwenden, aber bekommt das Wörterbuch-Objekt, das Sie stattdessen an den Namen dict gebunden haben.

14

Warum mit all diesen Serialisierungsmethoden umgehen? Es ist bereits als Python-Diktat in eine Datei geschrieben (allerdings mit dem unglücklichen Namen "dict"). Ändern Sie Ihr Programm, um die Daten mit einem besseren Variablennamen - vielleicht 'data' oder 'catalog' - auszugeben und speichern Sie die Datei als Python-Datei, sagen wir data.py. Dann können Sie die Daten einfach zur Laufzeit ohne lästiges Kopieren/Einfügen oder JSON/Shelve/etc importieren. Analyse:

from data import catalog 
+1

+1: Dies ist die beste Antwort auf die Frage des OP, IMHO. – martineau

Verwandte Themen