Saya telah melihat informasi yang diberikan Python docs , tapi saya masih sedikit bingung. Bisakah seseorang memposting kode sampel yang akan menulis file baru kemudian menggunakan acar untuk membuang kamus ke dalamnya?
Saya telah melihat informasi yang diberikan Python docs , tapi saya masih sedikit bingung. Bisakah seseorang memposting kode sampel yang akan menulis file baru kemudian menggunakan acar untuk membuang kamus ke dalamnya?
Jawaban:
Coba ini:
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__
). Saya tidak mengatakan Anda harus selalu menggunakan HIGHEST_PROTOCOL
, tetapi memastikan Anda tidak menggunakan protokol 0 atau 1 sebenarnya agak penting.
pickle.HIGHEST_PROTOCOL
sebenarnya dilakukan?
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)
Keuntungannya HIGHEST_PROTOCOL
adalah file menjadi lebih kecil. Ini membuat pembongkaran terkadang jauh lebih cepat.
Pemberitahuan penting : Ukuran file acar maksimum adalah sekitar 2GB.
import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
Untuk aplikasi Anda, berikut ini mungkin penting:
Lihat juga: Perbandingan format serialisasi data
Jika Anda mencari cara untuk membuat file konfigurasi, Anda mungkin ingin membaca artikel pendek saya File konfigurasi dalam 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"}
Secara umum, pengawetan a dict
akan gagal kecuali Anda hanya memiliki objek sederhana di dalamnya, seperti string dan integer.
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
>>>
Bahkan yang sangat sederhana dict
akan sering gagal. Itu tergantung isinya saja.
>>> 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>
Namun, jika Anda menggunakan serializer yang lebih baik seperti dill
atau cloudpickle
, maka sebagian besar kamus dapat diacak:
>>> import dill
>>> pik = dill.dumps(d)
Atau jika Anda ingin menyimpannya dict
ke file ...
>>> with open('save.pik', 'w') as f:
... dill.dump(globals(), f)
...
Contoh terakhir identik dengan jawaban baik lainnya yang diposting di sini (yang selain mengabaikan picklability dari konten dict
yang baik).
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
... pickle.dump({}, f)
...
biasanya lebih baik menggunakan implementasi 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.
Jika Anda hanya ingin menyimpan dikt dalam satu file, gunakan pickle
seperti itu
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)
Jika Anda ingin menyimpan dan mengembalikan beberapa kamus dalam banyak file untuk menyimpan dan menyimpan data yang lebih kompleks, gunakan anycache . Itu semua hal lain yang Anda butuhkanpickle
from anycache import anycache
@anycache(cachedir='path/to/files')
def myfunc(hello):
return {'hello', hello}
Anycache menyimpan myfunc
hasil yang berbeda tergantung pada argumen untuk file yang berbeda cachedir
dan memuatnya kembali.
Lihat dokumentasi untuk rincian lebih lanjut.
Cara sederhana untuk membuang data Python (misalnya kamus) ke file acar.
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()
Saya merasa acar membingungkan (mungkin karena saya kental). Saya menemukan bahwa ini bekerja, namun:
myDictionaryString=str(myDictionary)
Yang kemudian dapat Anda tulis ke file teks. Saya menyerah mencoba menggunakan acar karena saya mendapatkan kesalahan mengatakan kepada saya untuk menulis bilangan bulat ke file dat. Saya minta maaf karena tidak menggunakan acar.
dict
mengandung kedalaman objek lebih lanjut (yang dapat dicetak hanya dengan nama) dan / atau objek tanpa representasi string lengkap atau apa pun.