我有一个文件,其中包含一个包含Windows用户测试结果的数据结构。他使用pickle.dump
命令创建了此文件。在Ubuntu上,我尝试使用以下程序加载此测试结果:
import pickle
import my_module
f = open('results', 'r')
print pickle.load(f)
f.close()
但是我在pickle模块中遇到一个错误,没有名为“my_module”的模块。
问题可能是由于文件损坏,还是从Widows转移到Linux是不可能的?
答案 0 :(得分: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()函数会自动处理它。
此致
答案 1 :(得分:2)