【问题标题】:pickle.load Not Workingpickle.load 不工作
【发布时间】:2011-05-08 23:58:40
【问题描述】:

我得到了一个文件,其中包含来自 Windows 用户的测试结果的数据结构。他使用pickle.dump 命令创建了这个文件。在 Ubuntu 上,我尝试使用以下程序加载此测试结果:

import pickle
import my_module

f = open('results', 'r')
print pickle.load(f)
f.close()

但我在 pickle 模块中收到一个错误,即没有名为“my_module”的模块。

问题可能是由于文件损坏,或者可能是从 Widows 迁移到 Linux 的原因?

【问题讨论】:

  • 您的安装和用户的python版本和包结构是否相同?
  • Pickle 实现与平台无关。考虑以二进制模式打开文件并报告新结果。

标签: python pickle


【解决方案1】:

问题在于pickle 处理换行符的方式。某些换行符会削弱转储/加载数据中的模块名称。

以二进制模式存储和加载文件可能会有所帮助,但我也遇到了麻烦。经过长时间阅读文档和搜索后,我发现 pickle 可以处理几种不同的“协议”来存储数据,并且由于向后兼容,它使用最旧的协议:协议 0 - 原始 ASCII 协议。

用户可以通过在转储文件中存储数据时指定protocol关键字来选择现代协议,如下所示:

pickle.dump(someObj, open("dumpFile.dmp", 'wb'), protocol=2)

或者,通过选择可用的最高协议(目前为 2)

pickle.dump(someObj, open("dumpFile.dmp", 'wb'), protocol=pickle.HIGHEST_PROTOCOL)

协议版本存储在转储文件中,因此 Load() 函数会自动处理它。

问候

【讨论】:

    【解决方案2】:

    您应该以二进制模式打开 pickle 文件,尤其是当您在不同平台上使用 pickle 时。请参阅thisthis 问题以获得解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2013-03-21
      相关资源
      最近更新 更多