707 Stimmen

Wie kann ich pickle verwenden, um ein dict (oder ein anderes Python-Objekt) zu speichern?

Ich habe mir die Informationen angesehen, die die Python-Dokumente geben, aber ich bin immer noch ein wenig verwirrt. Könnte jemand einen Beispielcode posten, der eine neue Datei schreibt und dann Pickle verwendet, um ein Wörterbuch darin abzulegen?

1330voto

Blender Punkte 273072

Versuchen Sie dies:

import pickle

a = {'hello': 'world'}

with open('filename.pickle', 'wb') as handle:
    pickle.dump(a, handle, protocol=pickle.HIGHEST_PROTOCOL)

with open('filename.pickle', 'rb') as handle:
    b = pickle.load(handle)

print(a == b)

Die obige Lösung ist nicht spezifisch für eine dict Objekt. Derselbe Ansatz funktioniert für viele Python-Objekte, einschließlich Instanzen beliebiger Klassen und beliebig komplexer Verschachtelungen von Datenstrukturen. Ersetzen Sie zum Beispiel die zweite Zeile durch diese Zeilen:

import datetime
today = datetime.datetime.now()
a = [{'hello': 'world'}, 1, 2.3333, 4, True, "x", 
     ("y", [[["z"], "y"], "x"]), {'today', today}]

führt zu einem Ergebnis von True auch.

Einige Gegenstände können aufgrund ihrer Beschaffenheit nicht gebeizt werden. Es macht zum Beispiel keinen Sinn, eine Struktur, die ein Handle zu einer geöffneten Datei enthält, zu beizen.

178voto

Martin Thoma Punkte 105621
import pickle

your_data = {'foo': 'bar'}

# Store data (serialize)
with open('filename.pickle', 'wb') as handle:
    pickle.dump(your_data, handle, protocol=pickle.HIGHEST_PROTOCOL)

# Load data (deserialize)
with open('filename.pickle', 'rb') as handle:
    unserialized_data = pickle.load(handle)

print(your_data == unserialized_data)

Der Vorteil von HIGHEST_PROTOCOL ist, dass die Dateien kleiner werden. Das macht das Entpickeln manchmal viel schneller.

Wichtiger Hinweis : Die maximale Dateigröße von Pickles beträgt etwa 2 GB.

Alternative Möglichkeit

import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')

Alternative Formate

Für Ihre Bewerbung könnten folgende Punkte wichtig sein:

  • Unterstützung durch andere Programmiersprachen
  • Lese-/Schreibleistung
  • Kompaktheit (Dateigröße)

Siehe auch: Vergleich von Formaten zur Serialisierung von Daten

Falls Sie eher nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, sollten Sie meinen kurzen Artikel lesen Konfigurationsdateien in Python

47voto

user3465692 Punkte 459
# Save a dictionary into a pickle file.
import pickle

favorite_color = {"lion": "yellow", "kitty": "red"}  # create a dictionary
pickle.dump(favorite_color, open("save.p", "wb"))  # save it into a file named save.p

# -------------------------------------------------------------
# Load the dictionary back from the pickle file.
import pickle

favorite_color = pickle.load(open("save.p", "rb"))
# favorite_color is now {"lion": "yellow", "kitty": "red"}

17voto

Einfache Möglichkeit, Python-Daten (z.B. Wörterbücher) in eine Pickle-Datei zu übertragen.

import pickle

your_dictionary = {}

pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))

16voto

Mike McKerns Punkte 30236

Im Allgemeinen ist das Beizen einer dict wird fehlschlagen, wenn Sie nicht nur einfache Objekte wie Strings und Integers enthalten.

Python 2.7.9 (default, Dec 11 2014, 01:21:43) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from numpy import *
>>> type(globals())     
<type 'dict'>
>>> import pickle
>>> pik = pickle.dumps(globals())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
    Pickler(file, protocol).dump(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
    save(v)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle module objects
>>> 

Auch ein vraiment einfach dict wird oft scheitern. Es kommt einfach auf den Inhalt an.

>>> d = {'x': lambda x:x}
>>> pik = pickle.dumps(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
    Pickler(file, protocol).dump(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
    save(v)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 748, in save_global
    (obj, module, name))
pickle.PicklingError: Can't pickle <function <lambda> at 0x102178668>: it's not found as __main__.<lambda>

Wenn Sie jedoch einen besseren Serialisierer wie dill o cloudpickle dann können die meisten Wörterbücher gebeizt werden:

>>> import dill
>>> pik = dill.dumps(d)

Oder wenn Sie Ihre Daten speichern möchten dict in eine Datei...

>>> with open('save.pik', 'w') as f:
...   dill.dump(globals(), f)
... 

Das letztgenannte Beispiel ist identisch mit allen anderen guten Antworten, die hier gepostet wurden (die abgesehen von der Vernachlässigung der Beizbarkeit des Inhalts der dict sind gut).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X