Ich habe die Informationen in den Python-Dokumenten durchgesehen , bin aber immer noch ein wenig verwirrt. Könnte jemand Beispielcode posten, der eine neue Datei schreibt und dann pickle verwendet, um ein Wörterbuch darin abzulegen?
Ich habe die Informationen in den Python-Dokumenten durchgesehen , bin aber immer noch ein wenig verwirrt. Könnte jemand Beispielcode posten, der eine neue Datei schreibt und dann pickle verwendet, um ein Wörterbuch darin abzulegen?
Antworten:
Versuche 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
pickle.HIGHEST_PROTOCOL
?
__slots__
). Ich sage nicht, dass Sie immer verwenden sollten HIGHEST_PROTOCOL
, aber sicherzustellen, dass Sie nicht Protokoll 0 oder 1 verwenden, ist eigentlich ziemlich wichtig.
pickle.HIGHEST_PROTOCOL
eigentlich?
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 HIGHEST_PROTOCOL
ist, dass Dateien kleiner werden. Dies macht das Lösen manchmal viel schneller.
Wichtiger Hinweis : Die maximale Dateigröße von pickle beträgt ca. 2 GB.
import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
Für Ihre Anwendung kann Folgendes wichtig sein:
Siehe auch: Vergleich der Datenserialisierungsformate
Wenn Sie eher nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, lesen Sie möglicherweise meinen kurzen Artikel 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 schlägt das Beizen von a dict
fehl, es sei denn, Sie haben nur einfache Objekte wie Zeichenfolgen und Ganzzahlen.
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
>>>
Selbst ein wirklich einfacher dict
wird oft scheitern. Es kommt nur 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 Serializer wie dill
oder verwenden cloudpickle
, können die meisten Wörterbücher eingelegt werden:
>>> import dill
>>> pik = dill.dumps(d)
Oder wenn Sie Ihre dict
in einer Datei speichern möchten ...
>>> with open('save.pik', 'w') as f:
... dill.dump(globals(), f)
...
Das letztere Beispiel ist identisch mit allen anderen hier veröffentlichten guten Antworten (die, abgesehen von der Vernachlässigung der Auswahlbarkeit der Inhalte, dict
gut sind).
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
... pickle.dump({}, f)
...
Normalerweise ist es vorzuziehen, die cPickle-Implementierung zu verwenden
>>> import cPickle as pickle
>>> help(pickle.dump)
Help on built-in function dump in module cPickle:
dump(...)
dump(obj, file, protocol=0) -- Write an object in pickle format to the given file.
See the Pickler docstring for the meaning of optional argument proto.
Wenn Sie das Diktat nur in einer einzigen Datei speichern möchten, verwenden Sie es pickle
wie folgt
import pickle
a = {'hello': 'world'}
with open('filename.pickle', 'wb') as handle:
pickle.dump(a, handle)
with open('filename.pickle', 'rb') as handle:
b = pickle.load(handle)
Wenn Sie mehrere Wörterbücher in mehreren Dateien zum Zwischenspeichern und Speichern komplexerer Daten speichern und wiederherstellen möchten, verwenden Sie anycache . Es erledigt alle anderen Dinge, die Sie brauchenpickle
from anycache import anycache
@anycache(cachedir='path/to/files')
def myfunc(hello):
return {'hello', hello}
Anycache speichert die unterschiedlichen myfunc
Ergebnisse abhängig von den Argumenten in verschiedenen Dateien cachedir
und lädt sie neu.
Weitere Einzelheiten finden Sie in der Dokumentation .
Einfache Möglichkeit, Python-Daten (z. B. ein Wörterbuch) in eine Pickle-Datei zu kopieren.
import pickle
your_dictionary = {}
pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))
import pickle
dictobj = {'Jack' : 123, 'John' : 456}
filename = "/foldername/filestore"
fileobj = open(filename, 'wb')
pickle.dump(dictobj, fileobj)
fileobj.close()
Ich fand das Beizen verwirrend (möglicherweise weil ich dick bin). Ich fand jedoch, dass dies funktioniert:
myDictionaryString=str(myDictionary)
Was Sie dann in eine Textdatei schreiben können. Ich habe den Versuch, pickle zu verwenden, aufgegeben, da ich Fehler bekam, die mich aufforderten, Ganzzahlen in eine .dat-Datei zu schreiben. Ich entschuldige mich dafür, dass ich keine Gurke benutze.
dict
weitere Tiefe von Objekten zu enthalten (die möglicherweise nur von gedruckt werden) Name) und / oder Objekte ohne oder mit vollständiger Zeichenfolgendarstellung.