如何使用泡菜来保存字典?

Cha*_*hmu 304 python dictionary pickle

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

Ble*_*der 635

试试这个:

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
Run Code Online (Sandbox Code Playgroud)

  • @Blender:对于这个级别的问题无关紧要且不必要地复杂化 - 普通用户可以使用默认值. (30认同)
  • @houbysoft:对于Python 3用户来说是真的,但是在Python 2上,使用默认协议(0)不仅在时间和空间上非常低效,而且它实际上无法处理协议2+处理得很好的许多事情(例如new使用`__slots__`的样式类.我不是说你应该总是使用`HIGHEST_PROTOCOL`,但确保你不使用协议0或1实际上相当重要. (22认同)
  • `pickle.HIGHEST_PROTOCOL`实际上做了什么? (6认同)
  • @houbysoft:为什么要删除`pickle.HIGHEST_PROTOCOL`? (3认同)
  • @BallpointBen:它选择您的Python版本支持的最高协议版本:https://docs.python.org/3/library/pickle.html#data-stream-format (3认同)
  • 为了使其更简洁,您可以编写“protocol=-1”(类似于列表中的-1索引)。 (2认同)
  • 如果您要保存/加载大型对象,请使用“pickle.HIGHEST_PROTOCOL”。否则您可能会浪费大量时间和磁盘空间。 (2认同)

Mar*_*oma 78

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)
Run Code Online (Sandbox Code Playgroud)

优点HIGHEST_PROTOCOL是文件变小.这使得unpickling有时更快.

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

替代方式

import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
Run Code Online (Sandbox Code Playgroud)

替代格式

对于您的应用程序,以下可能很重要:

  • 其他编程语言的支持
  • 读/写性能
  • 紧凑性(文件大小)

另请参见:数据序列化格式的比较

如果您正在寻找一种制作配置文件的方法,您可能希望阅读我的简短文章Python中的配置文件

  • 我认为协议 = 4 及更高版本时 2GB 限制已被删除。 (5认同)

小智 25

# 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"}
Run Code Online (Sandbox Code Playgroud)

  • 是否有必要在 open() 之后使用 close()? (2认同)

Mik*_*rns 14

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

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
>>> 
Run Code Online (Sandbox Code Playgroud)

即使是非常简单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>
Run Code Online (Sandbox Code Playgroud)

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

>>> import dill
>>> pik = dill.dumps(d)
Run Code Online (Sandbox Code Playgroud)

或者如果你想保存dict到一个文件......

>>> with open('save.pik', 'w') as f:
...   dill.dump(globals(), f)
... 
Run Code Online (Sandbox Code Playgroud)

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


c0f*_*0de 9

如果您只想将 dict 存储在单个文件中,请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)
Run Code Online (Sandbox Code Playgroud)

如果要在多个文件中保存和恢复多个字典以缓存和存储更复杂的数据,请使用anycache。它可以完成您需要的所有其他工作pickle

from anycache import anycache

@anycache(cachedir='path/to/files')
def myfunc(hello):
    return {'hello', hello}
Run Code Online (Sandbox Code Playgroud)

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

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


Joh*_*ooy 8

>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
...     pickle.dump({}, f)
... 
Run Code Online (Sandbox Code Playgroud)

通常,最好使用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.
Run Code Online (Sandbox Code Playgroud)


小智 6

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

import pickle

your_dictionary = {}

pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

327191 次

最近记录:

6 年,11 月 前