Python中pickle的常见用例

145 投票
9 回答
26849 浏览
提问于 2025-04-16 02:31

我看过关于pickle的文档,但我不太明白它有什么用。

pickle通常用在哪些地方呢?

9 个回答

9

Pickle就像是你数据结构和类的“另存为”和“打开”功能。假设我想保存我的数据结构,这样在程序运行结束后,它们还能继续存在。

保存数据:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

加载数据:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

现在我不需要从头开始重新构建我的东西,我可以直接从我上次停下的地方继续。

12

这是一个最简单的往返示例。

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

补充:关于实际应用中使用“序列化”的例子,可能最复杂的用法是 ZODB(你需要深入了解源代码):http://svn.zope.org/

另外,PyPI 也提到了一些相关的内容:http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

我个人见过几个例子,序列化的对象通过网络发送,作为一种简单易用的网络传输协议。

70

我遇到过的一些用法:

1) 将程序的状态数据保存到磁盘上,这样在重新启动时可以从上次停止的地方继续运行(持久化)。

2) 在多核或分布式系统中,通过TCP连接发送Python数据(序列化)。

3) 将Python对象存储到数据库中。

4) 将任意Python对象转换成字符串,这样就可以用它作为字典的键(比如用于缓存和记忆化)。

最后一点有一些问题——两个相同的对象被序列化后可能会得到不同的字符串,甚至同一个对象被序列化两次也可能有不同的表示。这是因为序列化过程中可能会包含引用计数的信息。

为了强调@lunaryorn的评论——你绝对不应该从不可信的来源反序列化字符串,因为精心制作的序列化数据可能会在你的系统上执行任意代码。例如,可以参考这个链接

撰写回答