pickle.load 不起作用
我有一个文件,里面存储了一个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()函数会自动处理它。
祝好