【问题标题】:Is pickle file of python cross-platform?python的pickle文件是跨平台的吗?
【发布时间】:2010-12-23 09:36:15
【问题描述】:

我已经创建了一个小的 Python 脚本。我在 Linux 上保存了 pickle 文件,然后在 Windows 上使用它,然后再次在 Linux 上使用它,但现在该文件无法在 Linux 上运行,但它在 Windows 上运行良好。 是这样的,python 是 coss 平台的,但 pickle 文件不是。 这个有什么解决办法吗???

【问题讨论】:

  • Python 泡菜可能有刺。 Pickle 平台问题可能是可以预防的。请提出可能的问题预防建议。

标签: python file-io pickle


【解决方案1】:

Python 的 pickle 是完全跨平台的。

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

注意:在不同版本的 Python 之间传递 pickle 可能会引起麻烦,因此请尝试在两个平台上使用相同的版本。

【讨论】:

  • pickleguaranteed to be "backwards compatible"。我认为这意味着新版本会从旧版本中读取泡菜,但旧版本可能无法从新版本中读取泡菜。
  • 请注意,虽然 pickle 序列化格式 保证在 Python 版本中向后兼容,但 Python 中的其他内容则不然。例如,可以添加或删除函数和类,并且可以重命名模块。 Pickle 使用名称和模块存储对函数和类的引用,并且此类引用可能会在不同版本的 Python 之间中断。因此,通常加载使用不同版本的 Python 保存的泡菜是不安全的。
【解决方案2】:

pickle 模块 supports several different data formats。如果您指定特定的 pickle 格式而不是使用默认值 (0),您可能会遇到跨平台二进制文件问题。您可以通过指定协议 0 来使用纯 ASCII 泡菜文件。

【讨论】:

    【解决方案3】:

    也许您没有以二进制模式打开文件?见this stackoverflow question

    【讨论】:

      【解决方案4】:

      Pickle 应该是跨平台的,存在版本控制/协议问题,(请参阅 http://docs.python.org/library/pickle.html#data-stream-format)但一般来说,如果您在 Windows 和 unix 机器上使用相同版本的 python,它们应该是可互操作的。

      如果您使用 pickle 作为数据传输机制,您可能需要考虑实现较少的特定数据存储格式,例如 json、xml、csv、yaml 等。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 不反对,但在这种情况下使用 json 似乎有点尴尬。
        • 这真的取决于他在保存什么。如果都是数字和字符串列表,那么 JSON 很棒。如果是字典和类实例,就没有那么多了。
        • 如果你要保存类实例,那么只需使用pickle
        【解决方案6】:

        尝试一个有趣的想法是PyON(Python 对象表示法)。根据我的测试,当前版本似乎至少适用于简单的情况。不过,对于这个项目是否是一个好主意,邮件列表似乎存在一些分歧。

        【讨论】:

          猜你喜欢
          • 2011-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-15
          • 1970-01-01
          相关资源
          最近更新 更多