Ho esaminato le informazioni che il documenti di Python , ma sono ancora un po 'confuso. Qualcuno potrebbe pubblicare un codice di esempio che scriverebbe un nuovo file e quindi utilizzare pickle per scaricare un dizionario in esso?
Ho esaminato le informazioni che il documenti di Python , ma sono ancora un po 'confuso. Qualcuno potrebbe pubblicare un codice di esempio che scriverebbe un nuovo file e quindi utilizzare pickle per scaricare un dizionario in esso?
Risposte:
Prova questo:
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__
). Non sto dicendo che dovresti sempre usare HIGHEST_PROTOCOL
, ma assicurarti di non usare il protocollo 0 o 1 è in realtà piuttosto importante.
pickle.HIGHEST_PROTOCOL
effettivamente?
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)
Il vantaggio HIGHEST_PROTOCOL
è che i file diventano più piccoli. Questo rende il distacco a volte molto più veloce.
Avviso importante : la dimensione massima del file di pickle è di circa 2 GB.
import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
Per la tua applicazione, potrebbe essere importante quanto segue:
Vedi anche: Confronto dei formati di serializzazione dei dati
Nel caso in cui tu stia cercando un modo per creare file di configurazione, potresti voler leggere il mio breve articolo File di configurazione 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"}
In generale, il decapaggio a dict
fallirà a meno che non ci siano solo oggetti semplici, come stringhe e numeri interi.
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
>>>
Anche un semplice davverodict
spesso fallirà. Dipende solo dal contenuto.
>>> 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>
Tuttavia, se si utilizza un serializzatore migliore come dill
o cloudpickle
, la maggior parte dei dizionari può essere decapata:
>>> import dill
>>> pik = dill.dumps(d)
O se vuoi salvare il tuo dict
in un file ...
>>> with open('save.pik', 'w') as f:
... dill.dump(globals(), f)
...
Quest'ultimo esempio è identico a una qualsiasi delle altre buone risposte pubblicate qui (che oltre a trascurare la possibilità di scegliere il contenuto del contenuto dict
).
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
... pickle.dump({}, f)
...
normalmente è preferibile usare l'implementazione di cPickle
>>> 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.
Se vuoi solo memorizzare il dict in un singolo file, usa pickle
così
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)
Se si desidera salvare e ripristinare più dizionari in più file per la memorizzazione nella cache e archiviare dati più complessi, utilizzare anycache . Fa tutte le altre cose di cui hai bisogno in giropickle
from anycache import anycache
@anycache(cachedir='path/to/files')
def myfunc(hello):
return {'hello', hello}
Anycache memorizza i diversi myfunc
risultati a seconda degli argomenti in diversi filecachedir
e li ricarica.
Vedere la documentazione per ulteriori dettagli.
Modo semplice per scaricare i dati di Python (ad es. Dizionario) in un file pickle.
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()
Ho trovato il sottaceto confuso (forse perché sono spesso). Ho scoperto che funziona, però:
myDictionaryString=str(myDictionary)
Che è quindi possibile scrivere in un file di testo. Ho smesso di provare a usare pickle mentre stavo ricevendo errori che mi dicevano di scrivere numeri interi in un file .dat. Mi scuso per non aver usato il sottaceto.
dict
contenere un'ulteriore profondità di oggetti (che può essere stampata solo da nome) e / o oggetti senza alcuna o una rappresentazione di stringa completa.