Speichern Sie ein Wörterbuch in einer Datei für den späteren Abruf
Ich habe eine Suche aber nicht finden können, was in Bezug auf diese...
Ich bin auf der Suche nach einer Möglichkeit zum speichern der Wörterbuch-Datei und dann später in der Lage sein, um es zu laden wieder in eine variable zu einem späteren Zeitpunkt durch das Lesen der Datei.
Den Inhalt der Datei nicht haben, um "human-readable" es kann so chaotisch sein wie es will.
Dank
- Hyflex
BEARBEITEN
import cPickle as pickle
BDICT = {}
## Automatically generated START
name = "BOB"
name_title = name.title()
count = 5
BDICT[name_title] = count
name = "TOM"
name_title = name.title()
count = 5
BDICT[name_title] = count
name = "TIMMY JOE"
name_title = name.title()
count = 5
BDICT[name_title] = count
## Automatically generated END
if BDICT:
with open('DICT_ITEMS.txt', 'wb') as dict_items_save:
pickle.dump(BDICT, dict_items_save)
BDICT = {} ## Wiping the dictionary
## Usually in a loop
firstrunDICT = True
if firstrunDICT:
with open('DICT_ITEMS.txt', 'rb') as dict_items_open:
dict_items_read = dict_items_open.read()
if dict_items_read:
BDICT = pickle.load(dict_items_open)
firstrunDICT = False
print BDICT
Fehler:
Traceback (most recent call last):
File "C:\test3.py", line 35, in <module>
BDICT = pickle.load(dict_items_open)
EOFError
- Können Sie die Zeilen, um
BTS_DICT
? Sie haben bereits geladen das eingelegte Objekt mitBDICT
und dann versuchen, es wieder zu tun-ist BTS_DICT außerhalb Ihres Kontext-manager (with open()...
)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein paar Leute haben empfohlen
shelve
- ich habe nicht verwendet es, und ich bin nicht klopfen es. Ich habe verwendet, pickle/cPickle, und ich werde bieten die folgende Vorgehensweise:Wie zu verwenden Pickle/cPickle (die gekürzte version)...
Gibt es viele Gründe, warum Sie verwenden würden, Gurke (oder seine deutliche schnellere Variante, cPickle). Setzen Sie lapidar Gurke ist ein Weg, um Objekte zu speichern, die außerhalb des Prozesses.
Gurke nicht nur gibt Ihnen die Optionen, um Objekte zu speichern, die außerhalb Ihrer python-Prozess, aber auch so nicht in eine serialisierte Mode. Bedeutung First In, First Out Verhalten (FIFO).
So was ist gerade passiert?
Wenn Sie dann in der Datei, die gerade erstellt wurde (liegt jetzt in Ihrem Dateisystem zu verwenden), können Sie die Inhalte. Es ist chaotisch - hässlichen - und nicht sehr insightlful.
Was kommt als Nächstes?
Bringen, die ZURÜCK in unser Programm, das wir tun Sie einfach Folgendes:
Welcher folgende Rückgabe:
cPickle vs Gurke
Können Sie nicht sehen, viele Menschen nutzen Gurke in diesen Tagen - ich kann nicht glauben, aus der Spitze von meinem Kopf, warum würden Sie wollen, um die erste Implementierung von Gurke, vor allem, wenn es cPickle die nicht die gleiche Sache (mehr oder weniger), aber viel schneller!
So können Sie faul sein und tun:
Ist toll, wenn Sie etwas bereits gebaut, die verwendet Gurke... aber ich argumentieren, dass dies eine schlechte Empfehlung und ich voll erwarten, schimpfte auch für die Empfehlung! (sollten Sie wirklich einen Blick auf Ihre alte Implementierung, die den ursprünglichen
pickle
und sehen, wenn Sie Sie brauchen, um alles zu verfolgencPickle
Muster; wenn Sie legacy-code-oder production-code, mit der Sie arbeiten, dies spart Ihnen die Zeit zum refactoring (suchen/ersetzen alle Instanzen von Gurke mit cPickle).Ansonsten einfach:
überall und Sie sehen einen Verweis auf die
pickle
Bibliothek, ersetzen Sie einfach entsprechend. Sie haben den gleichen load() und dump () - Methode.Warnung Warnung ich will nicht zu diesem Beitrag schreiben mehr, als es ist, aber ich glaube, ich habe diese schmerzhafte Erinnerung, der nicht mit einer Unterscheidung zwischen
load()
undloads()
, unddump()
unddumps()
. Verdammt... das war dumm von mir! Die kurze Antwort ist, dass Last()/dump() stellt eine Datei-wie-Objekt, wheres Lasten (in)/dumps() führen ein ähnliches Verhalten, aber zu einem string-Objekt wie (Lesen Sie mehr dazu in der API, hier).Wieder, ich habe nicht verwendet
shelve
, aber wenn es funktioniert für Sie (oder andere) - dann yay!REAKTION AUF DEINE BEARBEITUNG
Müssen Sie entfernen den
dict_items_read = dict_items_open.read()
aus Ihrem Kontext-manager am Ende. Die Datei ist bereits geöffnet und gelesen. Sie nicht Lesen Sie es in so wie eine text Datei zu ziehen strings... es ist die Speicherung von eingelegten python-Objekte. Es ist nicht gedacht für die Augen! Es ist gedacht für load().Ihren code geändert... funktioniert einwandfrei bei mir (kopieren/einfügen, und führen Sie den code unten und sehen, ob es funktioniert). Beachten Sie in der Nähe der Unterseite habe ich entfernt Ihre
read()
des file-Objekts.if dict_items_read:
definiert?dict_items_read
so wird es nie wertet. Ich kopiert/eingefügt dieser code und es getestet gute.pickle
: stackoverflow.com/a/37138791/2306662 (ich bin über das 2.7-tag, aber das ist für andere Leute, die hier gelandet bei der Suche nach Python 3+ Antworten im besonderen)Python hat die
shelve
Modul für diese. Es können viele Objekte in einer Datei, die geöffnet werden können, bis später und Lesen Sie in als Objekte, aber es ist Betriebssystem-abhängig.Was Sie suchen, ist
Regal
.pickle
Worte für dicts zu. Es ist eine Serialisierung der Bibliothek, die funktioniert auf jedem python-Objekt. Regal ist nur eine bequeme Schicht oben Gurke, vor allem, wenn die Speicherung von vielen Objekt. Gurke ist vielleicht genug in Sie Fall, aber es gibt keinen Schaden in mit Regal.Können Sie auch Gurke für diese Aufgabe. Hier ist ein blog-post , die erklärt, wie es zu tun.
pickle
ist das perfekte Werkzeug für diesen job. Ich würde nur empfehlen, zu importierencPickle as pickle
für Größenordnungen bessere performance (und gleiche feature-set), und passpickle.HIGHEST_PROTOCOL
zu sichern. (Es ist standardmäßig eine alte 7-bit-Protokoll, um sicherzustellen, vorwärts-Kompatibilität.)(dp0 S'Bob' p1 I2 sS'Tom' p2 I2 sS'Jimmy' p3 I3 s.
Zwei Funktionen, die erstellen Sie eine Textdatei zum speichern der Wörterbuch-und laden ein Wörterbuch (das war schon vor dem speichern) für den Einsatz wieder.
Diese Funktionen können aufgerufen werden durch :