Python belgelerinin verdiği bilgilere baktım , ama hala biraz kafam karıştı. Birisi yeni bir dosya yazacak bir örnek kod gönderebilir ve ardından bir sözlük dökümü için turşu kullanabilir mi?
Python belgelerinin verdiği bilgilere baktım , ama hala biraz kafam karıştı. Birisi yeni bir dosya yazacak bir örnek kod gönderebilir ve ardından bir sözlük dökümü için turşu kullanabilir mi?
Yanıtlar:
Bunu dene:
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__
). Her zaman kullanmanız gerektiğini söylemiyorum HIGHEST_PROTOCOL
, ancak protokol 0 veya 1'i kullanmamanızı sağlamak aslında oldukça önemlidir.
pickle.HIGHEST_PROTOCOL
Aslında ne yapar ?
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)
Avantajı, HIGHEST_PROTOCOL
dosyaların küçülmesidir. Bu, seçmeyi bazen çok daha hızlı hale getirir.
Önemli uyarı : Turşu için maksimum dosya boyutu yaklaşık 2 GB'dir.
import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
Başvurunuz için aşağıdakiler önemli olabilir:
Ayrıca bakınız: Veri serileştirme formatlarının karşılaştırılması
Yapılandırma dosyaları oluşturmanın bir yolunu arıyorsanız , Python'daki yapılandırma dosyamdaki kısa makalemi okumak isteyebilirsiniz.
# 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"}
Genel olarak, dict
içinde dizeler ve tamsayılar gibi yalnızca basit nesneler yoksa a seçimini yapmak başarısız olur.
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
>>>
Gerçekten basit bir şey bile dict
çoğu zaman başarısız olur. Sadece içeriğe bağlı.
>>> 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>
Ancak, dill
veya gibi daha iyi bir serileştirici kullanırsanız cloudpickle
, çoğu sözlük turşuya alınabilir:
>>> import dill
>>> pik = dill.dumps(d)
Veya dict
bir dosyaya kaydetmek istiyorsanız ...
>>> with open('save.pik', 'w') as f:
... dill.dump(globals(), f)
...
İkinci örnek, burada yayınlanan diğer iyi cevapların herhangi biriyle aynıdır (bu, içeriğinin seçilebilirliğini ihmal etmekten başka dict
).
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
... pickle.dump({}, f)
...
normalde cPickle uygulamasını kullanmak tercih edilir
>>> 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.
Eğer dikteyi tek bir dosyada saklamak istiyorsanız, pickle
böyle kullanın
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)
Önbelleğe almak ve daha karmaşık verileri depolamak için birden çok dosyaya birden fazla sözlük kaydetmek ve geri yüklemek istiyorsanız, anycache kullanın . İhtiyacınız olan diğer tüm şeyleri yaparpickle
from anycache import anycache
@anycache(cachedir='path/to/files')
def myfunc(hello):
return {'hello', hello}
Anycache farklı depolar myfunc
, farklı dosyalardaki bağımsız değişkenlere bağlı olarak sonuçlarıcachedir
ve yeniden yükler.
Daha fazla ayrıntı için belgelere bakın.
Python verilerini (örneğin sözlük) bir turşu dosyasına dökmenin basit yolu.
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()
Turşu kafa karıştırıcı buldum (muhtemelen kalın olduğum için). Ama bunun işe yaradığını gördüm:
myDictionaryString=str(myDictionary)
Daha sonra bir metin dosyasına yazabilirsiniz. Bir .dat dosyasına tamsayı yazmamı söyleyen hatalar alırken turşu kullanmaya çalışırken vazgeçtim. Turşu kullanmadığım için özür dilerim.
dict
nesnenin daha fazla derinlik içermesi (sadece tarafından basılabilir) name) ve / veya tam dize gösterimi olmayan nesneler.