关于python:如何使用pickle保存字典?

How can I use pickle to save a dict?

我查看了Python文档提供的信息,但我仍然有点困惑。 有人可以发布编写新文件的示例代码,然后使用pickle将字典转储到其中吗?


试试这个:

1
2
3
4
5
6
7
8
9
10
11
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
2
3
4
5
6
7
8
9
10
11
12
13
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的优点是文件变小。这使得unpickling有时更快。

重要提示:pickle的最大文件大小约为2GB。

替代方式

1
2
3
4
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中的配置文件


1
2
3
4
5
6
7
8
9
10
11
12
# 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"}


通常,除非你只有简单的对象,如字符串和整数,否则酸洗dict将失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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也经常会失败。它只取决于内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> 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>

但是,如果您使用更好的序列化程序,如dillcloudpickle,那么大多数词典都可以被腌制:

1
2
>>> import dill
>>> pik = dill.dumps(d)

或者,如果要将dict保存到文件中......

1
2
3
>>> with open('save.pik', 'w') as f:
...   dill.dump(globals(), f)
...

后一个例子与这里发布的任何其他好的答案相同(除了忽略dict内容的可选性是好的)。


1
2
3
4
>>> import pickle
>>> with open("/tmp/picklefile","wb") as f:
...     pickle.dump({}, f)
...

通常,最好使用cPickle实现

1
2
3
4
5
6
7
8
>>> 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.

将Python数据(例如字典)转储到pickle文件的简单方法。

1
2
3
4
5
import pickle

your_dictionary = {}

pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))


如果您只想将dict存储在单个文件中,请使用pickle

1
2
3
4
5
6
7
8
9
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所需的所有其他功能

1
2
3
4
5
from anycache import anycache

@anycache(cachedir='path/to/files')
def myfunc(hello):
    return {'hello', hello}

Anycache根据参数存储不同的myfunc结果
cachedir中的不同文件并重新加载它们。

有关更多详细信息,请参阅文档。


1
2
3
4
5
6
7
8
9
10
11
import pickle

dictobj = {'Jack' : 123, 'John' : 456}

filename ="/foldername/filestore"

fileobj = open(filename, 'wb')

pickle.dump(dictobj, fileobj)

fileobj.close()

我发现酸洗令人困惑(可能是因为我很厚)。我发现这有效,但是:

1
myDictionaryString=str(myDictionary)

然后您可以将其写入文本文件。我放弃了尝试使用pickle,因为我收到错误告诉我将整数写入.dat文件。我为不使用泡菜而道歉。