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?
Antworten
Zu viele Anzeigen?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.
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
- CSV: Supereinfaches Format ( Lesen und Schreiben )
- JSON: Gut geeignet zum Schreiben von menschenlesbaren Daten; SEHR häufig verwendet ( Lesen und Schreiben )
- YAML: YAML ist eine Obermenge von JSON, aber einfacher zu lesen ( Lesen und Schreiben , Vergleich von JSON und YAML )
- einlegen: Ein Python-Serialisierungsformat ( Lesen und Schreiben )
- MessagePack ( Python-Paket ): Eine kompaktere Darstellung ( Lesen und Schreiben )
- HDF5 ( Python-Paket ): Schön für Matrizen ( Lesen und Schreiben )
- XML: existiert auch *seufz* ( lesen & schreiben. )
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
# 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"}
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).
- See previous answers
- Weitere Antworten anzeigen