Tôi đã xem qua thông tin mà các tài liệu Python cung cấp, nhưng tôi vẫn hơi bối rối. Ai đó có thể đăng mã mẫu sẽ viết một tệp mới sau đó sử dụng dưa chua để đổ từ điển vào đó không?
Tôi đã xem qua thông tin mà các tài liệu Python cung cấp, nhưng tôi vẫn hơi bối rối. Ai đó có thể đăng mã mẫu sẽ viết một tệp mới sau đó sử dụng dưa chua để đổ từ điển vào đó không?
Câu trả lời:
Thử cái này:
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__
). Tôi không nói rằng bạn nên luôn luôn sử dụng HIGHEST_PROTOCOL
, nhưng đảm bảo bạn không sử dụng giao thức 0 hoặc 1 thực sự khá quan trọng.
pickle.HIGHEST_PROTOCOL
thực sự làm?
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)
Ưu điểm HIGHEST_PROTOCOL
là các tập tin trở nên nhỏ hơn. Điều này làm cho việc tháo gỡ đôi khi nhanh hơn nhiều.
Thông báo quan trọng : Kích thước tệp tối đa của dưa chua là khoảng 2 GB.
import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
Đối với ứng dụng của bạn, những điều sau đây có thể quan trọng:
Xem thêm: So sánh các định dạng tuần tự hóa dữ liệu
Trong trường hợp bạn muốn tìm cách tạo tệp cấu hình, bạn có thể muốn đọc các tệp Cấu hình bài viết ngắn của tôi bằng 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"}
Nói chung, Pickling a dict
sẽ thất bại trừ khi bạn chỉ có các đối tượng đơn giản trong đó, như chuỗi và số nguyên.
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
>>>
Ngay cả một thực sự đơn giản dict
sẽ thường thất bại. Nó chỉ phụ thuộc vào nội dung.
>>> 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>
Tuy nhiên, nếu bạn sử dụng một bộ nối tiếp tốt hơn như dill
hoặc cloudpickle
, thì hầu hết các từ điển có thể được chọn:
>>> import dill
>>> pik = dill.dumps(d)
Hoặc nếu bạn muốn lưu dict
tệp của bạn vào một tệp ...
>>> with open('save.pik', 'w') as f:
... dill.dump(globals(), f)
...
Ví dụ sau giống hệt với bất kỳ câu trả lời hay nào khác được đăng ở đây (ngoài việc bỏ qua khả năng chọn lọc nội dung của nội dung dict
là tốt).
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
... pickle.dump({}, f)
...
thông thường nên sử dụng triển khai 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.
Nếu bạn chỉ muốn lưu trữ dict trong một tệp duy nhất, hãy sử dụng pickle
như thế
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)
Nếu bạn muốn lưu và khôi phục nhiều từ điển trong nhiều tệp để lưu trữ và lưu trữ dữ liệu phức tạp hơn, hãy sử dụng anycache . Nó làm tất cả những thứ khác bạn cần xung quanhpickle
from anycache import anycache
@anycache(cachedir='path/to/files')
def myfunc(hello):
return {'hello', hello}
Anycache lưu trữ các myfunc
kết quả khác nhau tùy thuộc vào các đối số cho các tệp khác nhau cachedir
và tải lại chúng.
Xem tài liệu để biết thêm chi tiết.
Cách đơn giản để kết xuất dữ liệu Python (ví dụ: từ điển) vào tệp dưa chua.
import pickle
your_dictionary = {}
pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))
Tôi đã tìm thấy dưa chua khó hiểu (có thể vì tôi dày). Tôi thấy rằng điều này hoạt động, mặc dù:
myDictionaryString=str(myDictionary)
Mà sau đó bạn có thể viết vào một tệp văn bản. Tôi đã từ bỏ việc cố gắng sử dụng dưa chua vì tôi gặp lỗi khi bảo tôi viết số nguyên vào tệp .dat. Tôi xin lỗi vì đã không sử dụng dưa chua.
dict
để chứa các đối tượng có chiều sâu hơn (có thể được in chỉ bằng tên) và / hoặc các đối tượng mà không có bất kỳ hoặc một đại diện chuỗi hoàn chỉnh.