Wie kann ich Gurke benutzen, um einen Dict zu speichern?

Ich habe durch die Informationen geschaut, die die Python-Dokumente geben, aber ich bin immer noch ein wenig verwirrt. Könnte jemand Post Beispiel Code, der eine neue Datei schreiben würde dann verwenden Pickle, um ein Wörterbuch in es zu dump?

7 Solutions collect form web for “Wie kann ich Gurke benutzen, um einen Dict zu speichern?”

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 

Als Blender scheint nicht, HIGHEST_PROTOCOL zu seiner Antwort hinzuzufügen, hier ist eins mit ihm:

 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 Dateien kleiner werden. Das macht das Klettern manchmal viel schneller.

Wichtiger Hinweis : Die maximale Dateigröße der Gurke beträgt ca. 2GB.

Alternativen

  • CSV: Super einfaches Format ( lesen & schreiben )
  • JSON: Nett zum Schreiben von menschlich lesbaren Daten; SEHR häufig verwendete ( lesen & schreiben )
  • YAML: YAML ist eine Superset von JSON, aber leichter zu lesen ( lesen & schreiben , Vergleich von JSON und YAML )
  • Pickle: Ein Python-Serialisierungsformat ( lesen & schreiben )
  • MessagePack ( Python-Paket ): Kompaktere Darstellung ( Lesen & Schreiben )
  • HDF5 ( Python-Paket ): Schön für Matrizen ( lesen & schreiben )
  • XML: existiert auch * Seufzer * ( lesen & schreiben )

Für Ihre Bewerbung könnte folgendes wichtig sein:

  • Unterstützung durch andere Programmiersprachen
  • Lesen / Schreiben von Leistung
  • Kompaktheit (Dateigröße)

Siehe auch: Vergleich der Daten-Serialisierungsformate

Wenn Sie lieber nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, möchten Sie vielleicht meinen kurzen Artikel Konfigurationsdateien in Python lesen

 # 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"} 
 >>> 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. 

Im Allgemeinen wird das Beizen eines dict fehlschlagen, es sei denn, Sie haben nur einfache Objekte in ihm, wie Strings 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 >>> 

Sogar ein wirklich einfacher dict wird oft versagen. Es hängt nur vom Inhalt ab.

 >>> 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> 

Allerdings, wenn Sie einen besseren Serializer wie dill oder cloudpickle , dann können die meisten Wörterbücher gebeizt werden:

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

Oder wenn du deinen dict in einer Datei speichern möchtest …

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

Das letztere Beispiel ist identisch mit irgendwelchen anderen guten Antworten, die hier gepostet werden (was abgesehen von der Vernachlässigung der Picklabilität des Inhalts des Diktats gut ist).

 import pickle dictobj = {'Jack' : 123, 'John' : 456} filename = "/foldername/filestore" fileobj = open(filename, 'wb') pickle.dump(dictobj, fileobj) fileobj.close() 

Ich habe das Beizen verwirrend gefunden (vielleicht weil ich dick bin). Ich habe festgestellt, dass das aber funktioniert:

 myDictionaryString=str(myDictionary) 

Was Sie dann in eine Textdatei schreiben können. Ich gab auf, um Pickle zu benutzen, da ich Fehler bekam, mir zu sagen, dass ich Integers zu einer .dat-Datei schreiben sollte. Ich entschuldige mich dafür, dass ich keine Gurke benutzt habe.

  • Multiprocessing.Process Unterklasse funktioniert auf Linux aber nicht Windows
  • Mit cPickle, um ein großes Wörterbuch zu serialisieren, verursacht MemoryError
  • Was ist der Unterschied zwischen Gurke und Regal?
  • Python "IOError: [Errno 22] Ungültiges Argument" bei der Verwendung von cPickle, um ein großes Array auf das Netzwerklaufwerk zu schreiben
  • Erhalt der numpy Blick beim Beizen
  • Pickle oder Json?
  • Python, schreibt eine Ganzzahl in eine '.txt'-Datei
  • Wie kann ich eine Liste in einer Datei speichern und als Listentyp lesen?
  • Installieren von cPickle mit Python 3.5
  • Python-Multiprozess-Beizfehler
  • Pickle Queue Objekte in Python
  • Python ist die beste Programmiersprache der Welt.