it-swarm.com.de

Wie kann ich mit pickle ein Diktat speichern?

Ich habe die Informationen durchgesehen, die die Python-Dokumente geben, aber ich bin immer noch ein wenig verwirrt. Könnte jemand einen Beispielcode veröffentlichen, der eine neue Datei schreibt, und dann pickle verwenden, um ein Wörterbuch darin abzulegen?

269
Chachmu

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
580
Blender
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 Abbeizen manchmal viel schneller.

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

Alternativer Weg

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

Alternative Formate

Für Ihre Anwendung kann Folgendes wichtig sein:

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

Siehe auch: Vergleich von Datenserialisierungsformaten

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

69
Martin Thoma
# 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"}
23
user3465692

Im Allgemeinen schlägt das Beizen eines dict fehl, es sei denn, Sie haben nur einfache Objekte darin, 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
>>> 

Sogar ein wirklich einfaches 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 cloudpickle verwenden, können die meisten Wörterbücher ausgewählt werden:

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

Oder wenn Sie Ihr dict in einer Datei speichern möchten ...

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

Das letztgenannte Beispiel ist identisch mit den anderen hier veröffentlichten guten Antworten (die abgesehen von der Vernachlässigung der Beizbarkeit des Inhalts von dict gut sind).

11
Mike McKerns
>>> 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.
8
John La Rooy

Einfache Möglichkeit, Python Daten (z. B. Wörterbuch) in eine Pickle-Datei zu kopieren.

import pickle

your_dictionary = {}

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

Wenn Sie das Diktat nur in einer einzigen Datei speichern möchten, verwenden Sie pickle so

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 zum Zwischenspeichern und Speichern komplexerer Daten in mehreren Dateien speichern und wiederherstellen möchten, verwenden Sie anycache . Es erledigt alle anderen Dinge, die Sie brauchen, um pickle

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 für unterschiedliche Dateien in cachedir und lädt sie neu.

Weitere Informationen finden Sie in der Dokumentation .

4
c0fec0de
import pickle

dictobj = {'Jack' : 123, 'John' : 456}

filename = "/foldername/filestore"

fileobj = open(filename, 'wb')

pickle.dump(dictobj, fileobj)

fileobj.close()
2
Rahul Nair