Python的pickle文件跨平台吗?

21

我创建了一个小的Python脚本,将pickle文件保存在Linux上,然后在Windows上使用它,然后再次在Linux上使用它,但现在该文件在Linux上无法工作,但在Windows上完美运行。

是这样的,Python是跨平台的,但pickle文件不是。

有没有解决方法?


48
Python的“pickle”可能会有问题。Pickle平台问题可能是可以预防的。请提出可能的问题预防方案。 - aehiilrs
6个回答

37

Python的pickle是完美跨平台的。

这可能是由于Windows和Linux之间的EOL(行结束符)差异造成的。确保在写入和读取pickle文件时都使用二进制模式打开它们,分别使用open()的“wb”和“rb”模式。

注意:在不同版本的Python之间传递pickles可能会引起问题,因此请尽量在两个平台上使用相同的版本。


“pickle”被保证是“向后兼容”的(http://docs.python.org/2/library/pickle.html#relationship-to-other-python-modules)。我认为这意味着新版本将读取旧版本的pickles,但旧版本可能无法读取新版本的pickles。 - max
1
请注意,虽然pickle序列化格式在Python版本之间保证向后兼容,但Python中的其他内容并非如此。例如,函数和类可能会被添加或删除,模块可能会被重命名。Pickle使用名称和模块存储对函数和类的引用,这些引用可能会在不同版本的Python之间中断。因此,通常情况下不安全加载使用不同版本Python保存的pickles。 - taleinat

12

pickle 模块支持几种不同的数据格式。如果您指定了特定的 pickle 格式而不是使用默认值(0),则可能会遇到跨平台二进制文件问题。您可以通过指定协议 0 来使用纯 ASCII pickle 文件。


4

4

Pickle应该是跨平台的,但存在版本/协议问题(请参见http://docs.python.org/library/pickle.html#data-stream-format),但通常情况下,如果您在Windows和Unix上使用相同版本的Python,则它们应该是可互操作的。

如果您将Pickle用作数据传输机制,则可能需要考虑数据存储的实现不太特定的格式,例如json、xml、csv、yaml等。


1
你可以使用 json 替代 pickle。如果它能保存你的数据,那么你就知道它是跨平台的。

不是想要点踩,但在这种情况下使用JSON似乎有些尴尬。 - ChristopheD
1
这真的取决于他正在保存什么。如果它是所有数字和字符串列表,那么JSON非常好。但如果它是字典和类实例,就不太适合了。 - steveha
如果您正在保存类实例,则只需使用“pickle”。 - steveha

0
一个有趣的尝试是使用PyON(Python对象表示法)。根据我的测试,当前版本似乎至少对简单情况有效。然而,在邮件列表中似乎存在一些关于该项目是否是一个好主意的争议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接