Examinei as informações que os documentos do Python fornecem, mas ainda estou um pouco confuso. Alguém poderia postar um exemplo de código que gravaria um novo arquivo e depois usar pickle para despejar um dicionário nele?
Examinei as informações que os documentos do Python fornecem, mas ainda estou um pouco confuso. Alguém poderia postar um exemplo de código que gravaria um novo arquivo e depois usar pickle para despejar um dicionário nele?
Respostas:
Tente o seguinte:
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__
). Não estou dizendo que você sempre deve usar HIGHEST_PROTOCOL
, mas garantir que você não use o protocolo 0 ou 1 é realmente muito importante.
pickle.HIGHEST_PROTOCOL
realmente faz?
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)
A vantagem HIGHEST_PROTOCOL
é que os arquivos ficam menores. Isso faz com que a remoção de manchas às vezes seja muito mais rápida.
Aviso importante : O tamanho máximo do arquivo de pickle é de cerca de 2 GB.
import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
Para seu aplicativo, o seguinte pode ser importante:
Consulte também: Comparação de formatos de serialização de dados
Caso você esteja procurando uma maneira de criar arquivos de configuração, leia meu pequeno artigo Arquivos de configuração em 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"}
Em geral, a escolha de a dict
falhará, a menos que você tenha apenas objetos simples, como seqüências de caracteres e números inteiros.
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
>>>
Mesmo um simples realmentedict
falha frequentemente. Depende apenas do conteúdo.
>>> 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>
No entanto, se você usar um serializador melhor como dill
ou cloudpickle
, a maioria dos dicionários poderá ser configurada:
>>> import dill
>>> pik = dill.dumps(d)
Ou se você quiser salvar o dict
arquivo em um arquivo ...
>>> with open('save.pik', 'w') as f:
... dill.dump(globals(), f)
...
O último exemplo é idêntico a qualquer uma das outras boas respostas postadas aqui (que além de negligenciar a escolha do conteúdo dict
são boas).
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
... pickle.dump({}, f)
...
normalmente é preferível usar a implementação 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 você quiser apenas armazenar o dict em um único arquivo, use pickle
assim
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 você deseja salvar e restaurar vários dicionários em vários arquivos para armazenar em cache e armazenar dados mais complexos, use anycache . Faz todas as outras coisas que você precisapickle
from anycache import anycache
@anycache(cachedir='path/to/files')
def myfunc(hello):
return {'hello', hello}
O Anycache armazena os diferentes myfunc
resultados, dependendo dos argumentos para diferentes arquivos, cachedir
e os recarrega.
Consulte a documentação para obter mais detalhes.
Maneira simples de despejar dados do Python (por exemplo, dicionário) em um arquivo 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()
Eu achei a decapagem confusa (possivelmente porque sou grossa). Descobri que isso funciona, no entanto:
myDictionaryString=str(myDictionary)
Que você pode gravar em um arquivo de texto. Desisti de tentar usar pickle, pois estava recebendo erros dizendo para escrever números inteiros em um arquivo .dat. Peço desculpas por não usar picles.
dict
a contenha mais profundidade de objetos (que pode ser impressa apenas por nome) e / ou objetos sem nenhuma ou uma representação de string completa.