Python中pickle的常见用例

Posted

技术标签:

【中文标题】Python中pickle的常见用例【英文标题】:Common use-cases for pickle in Python 【发布时间】:2011-03-27 04:54:10 【问题描述】:

我查看了pickle 文档,但我不明白pickle 的用处。

pickle 的一些常见用例是什么?

【问题讨论】:

我不了解酸洗的部分是为什么不将值保存到文件中?为什么要腌制它? 【参考方案1】:

最小的往返示例..

>>> 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

我亲眼目睹了几个通过网络发送腌制对象的示例,作为一种易于使用的网络传输协议。

【讨论】:

【参考方案2】:

我在我的一个项目中使用过它。如果应用程序在运行期间被终止(它执行了一项冗长的任务并处理了大量数据),我需要保存整个数据结构并在应用程序再次运行后重新加载它。我为此使用了 cPickle,因为速度是至关重要的,而且数据量非常大。

【讨论】:

【参考方案3】:

我遇到的一些用途:

1) 将程序的状态数据保存到磁盘,以便在重新启动时可以从中断处继续(持久性)

2) 在多核或分布式系统中通过 TCP 连接发送 python 数据(编组)

3) 在数据库中存储 python 对象

4) 将任意 python 对象转换为字符串,以便它可以用作字典键(例如,用于缓存和记忆)。

最后一个存在一些问题 - 两个相同的对象可能会被腌制并导致不同的字符串 - 甚至相同的对象腌制两次也可能有不同的表示。这是因为 pickle 可以包含引用计数信息。

为了强调@lunaryorn 的评论——你永远不应该从不受信任的来源解压字符串,因为精心制作的泡菜可以在你的系统上执行任意代码。例如见https://blog.nelhage.com/2011/03/exploiting-pickle/

【讨论】:

不应通过网络或其他不受信任的渠道传输腌制对象,除非腌制数据经过仔细保护以防篡改。 pickle 文档明确警告永远不要从不受信任或未经身份验证的来源取消腌制数据。 @lunaryorn:好点。如果您要在机器之间传输腌制数据,请使用安全通道,例如 SSL 或 SSH 隧道。 那么您仍然相信端点不会利用您,这可能会也可能不会,具体取决于上下文。 第 4) 点是真的吗?我发现这有一些(旧)证据不起作用here。 @salotz 请参阅以下段落,我注意到两次酸洗相同的数据结构可能会导致不同的字符串。这是否是一个问题取决于上下文。如果您将其用作缓存键以提高性能,那么偶尔的缓存未命中可能并不重要。 YMMV。【参考方案4】:

添加一个真实示例:Python 的 Sphinx 文档工具使用 pickle 缓存已解析的文档和文档之间的交叉引用,以加快文档的后续构建。

【讨论】:

【参考方案5】:

酸洗对于分布式和并行计算是绝对必要的。

假设您想使用 multiprocessing(或使用 pyina 跨集群节点)执行并行 map-reduce,那么您需要确保要在并行资源之间映射的函数会腌制。如果它不腌制,则无法将其发送到其他进程、计算机等上的其他资源。另请参阅here 以获得一个很好的示例。

为此,我使用dill,它可以序列化python 中的几乎任何东西。 Dill 也有 some good tools 帮助您了解在代码失败时导致酸洗失败的原因。

而且,是的,人们使用选择来保存计算的状态,或者您的ipython 会话,或其他任何东西。

【讨论】:

【参考方案6】:

对于初学者(就像我一样)在阅读official documentation 时,真的很难理解为什么首先要使用pickle。这可能是因为文档暗示您已经知道序列化的全部目的。看了序列化的general description,才明白这个模块的原因和它的常见用例。忽略特定编程语言的序列化的广泛解释可能会有所帮助: https://***.com/a/14482962/4383472, What is serialization?, https://***.com/a/3984483/4383472

【讨论】:

你的“答案”不是一个答案,它更像是一个评论。 OP 的问题是“pickle 的一些常见用例是什么?”。你觉得你以任何方式回答了这个问题吗? 好吧,我觉得我已经回答了这个问题,因为当我尝试阅读此模块here、here 和here 时,我也很难理解pickle 的常见用法。因为大多数情况下,他们开始解释 pickle 的作用,前提是您知道整个序列化概念背后的动机。在我阅读了关于序列化的简单 wiki 文章后,我掌握了总体思路以及“常见案例”。也许它会帮助某人...... 其中一些常见的情况是……?如果有一些未在其他答案中列出……将它们添加到您的答案中将是非常合适的。【参考方案7】:

我可以告诉你我用它的用途和见过它的用途:

游戏配置文件保存 游戏数据可以挽救生命和健康 以前输入到程序的数字的记录

这些是我至少使用它的那些

【讨论】:

【参考方案8】:

对于您的数据结构和类,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)

现在我不必从头开始构建 myStuff,我可以从中断的地方继续。

【讨论】:

【参考方案9】:

我在网页抓取期间使用酸洗,当时我想存储超过 8000k 的网址并希望尽快处理它们,所以我使用酸洗,因为它的输出质量非常高。

您可以轻松访问 url 和停止位置,甚至作业目录关键字也可以非常快速地获取 url 详细信息以恢复进程。

【讨论】:

以上是关于Python中pickle的常见用例的主要内容,如果未能解决你的问题,请参考以下文章

保存文件的最佳实践 - python pickle 用例

pytest 用例编写规则命令行执行用例用例执行的先后顺序

如何编写测试用例

selenium+BeautifulReport+python自动化+用例不通过的时候发送邮件

Python3-unittest测试框架之测试用例类

Python Api接口自动化测试框架 代码写用例