pickle.load 不起作用

4 投票
2 回答
15610 浏览
提问于 2025-04-16 17:13

我有一个文件,里面存储了一个Windows用户的测试结果数据结构。他是用pickle.dump这个命令创建的这个文件。在Ubuntu系统上,我尝试用下面的程序来加载这些测试结果:

import pickle
import my_module

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

但是我在使用pickle模块时遇到了一个错误,提示没有名为"my_module"的模块。

这个问题可能是因为文件损坏,还是因为从Windows转到Linux导致的呢?

2 个回答

4

问题出在pickle处理换行符的方式上。有些换行符会导致模块名称在保存或加载的数据中出现问题。

以二进制模式存储和加载文件可能会有所帮助,但我在这方面也遇到了一些麻烦。经过长时间阅读文档和搜索,我发现pickle有几种不同的“协议”来存储数据。为了兼容旧版本,它使用的是最老的协议:协议0,也就是最初的ASCII协议。

用户可以通过在存储数据时指定协议关键字来选择现代协议,像这样:

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

或者,选择当前可用的最高协议(目前是协议2)

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

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

祝好

2

你应该以二进制模式打开被“腌制”的文件,特别是当你在不同的平台上使用pickle的时候。想了解更多,可以看看这个这个问题的解释。

撰写回答