问题:如何使用泡菜保存字典?
我已经仔细阅读了Python文档提供的信息,但仍然有些困惑。有人可以张贴示例代码来编写新文件,然后使用pickle将字典转储到其中吗?
回答 0
尝试这个:
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
回答 1
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)
的优点HIGHEST_PROTOCOL
是文件变小。这使得脱皮有时更快。
重要提示:泡菜的最大文件大小约为2GB。
替代方式
import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
替代格式
- CSV:超简单格式(读写)
- JSON:非常适合编写人类可读的数据;非常常用(读和写)
- YAML:YAML是JSON的超集,但更易于阅读(读写,JSON和YAML的比较)
- pickle:一种Python序列化格式(读写)
- MessagePack(Python软件包):更紧凑的表示形式(读和写)
- HDF5(Python程序包):适用于矩阵(读写)
- XML:存在太多*叹息*(读与写)
对于您的应用程序,以下内容可能很重要:
- 其他编程语言的支持
- 阅读/写作表现
- 紧凑度(文件大小)
另请参阅:数据序列化格式的比较
如果您想寻找一种制作配置文件的方法,则可能需要阅读我的短文《Python中的配置文件》。
回答 2
# 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"}
回答 3
通常,dict
除非仅包含简单的对象(例如字符串和整数),否则酸洗a 将失败。
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
>>>
即使是非常简单的方法dict
也会经常失败。它仅取决于内容。
>>> 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>
但是,如果使用更好的序列化器(例如dill
或)cloudpickle
,则可以对大多数词典进行腌制:
>>> import dill
>>> pik = dill.dumps(d)
或者,如果您想将dict
文件保存到文件中…
>>> with open('save.pik', 'w') as f:
... dill.dump(globals(), f)
...
后一个示例与此处发布的任何其他好的答案相同(除了忽略商品内容的可腌性之外dict
)。
回答 4
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
... pickle.dump({}, f)
...
通常,最好使用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.
回答 5
如果您只想将字典存储在单个文件中,请pickle
像这样使用
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)
如果要在多个文件中保存和还原多个词典以进行缓存和存储更复杂的数据,请使用anycache。它可以完成您需要的所有其他工作pickle
from anycache import anycache
@anycache(cachedir='path/to/files')
def myfunc(hello):
return {'hello', hello}
Anycache myfunc
根据不同文件的参数存储不同的结果,cachedir
然后重新加载它们。
有关更多详细信息,请参见文档。
回答 6
将Python数据(例如字典)转储到pickle文件的简单方法。
import pickle
your_dictionary = {}
pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))
回答 7
import pickle
dictobj = {'Jack' : 123, 'John' : 456}
filename = "/foldername/filestore"
fileobj = open(filename, 'wb')
pickle.dump(dictobj, fileobj)
fileobj.close()
回答 8
我发现酸洗令人困惑(可能是因为我很胖)。我发现这可行,但是:
myDictionaryString=str(myDictionary)
然后可以将其写入文本文件。我遇到错误并告诉我将整数写入.dat文件时,我放弃尝试使用pickle。很抱歉没有使用泡菜。