Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pickle.load不工作_Python_Pickle - Fatal编程技术网

Python pickle.load不工作

Python pickle.load不工作,python,pickle,Python,Pickle,我得到了一个包含数据结构的文件,其中包含来自Windows用户的测试结果。他使用pickle.dump命令创建了这个文件。在Ubuntu上,我尝试用以下程序加载此测试结果: import pickle import my_module f = open('results', 'r') print pickle.load(f) f.close() 但是我在pickle模块中得到一个错误,没有名为“my_module”的模块 问题可能是由于文件损坏,或者可能是因为从Widows迁移到Linux?

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

import pickle
import my_module

f = open('results', 'r')
print pickle.load(f)
f.close()
但是我在pickle模块中得到一个错误,没有名为“my_module”的模块


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

您应该以二进制模式打开pickle文件,尤其是在不同平台上使用pickle时。有关说明,请参阅和问题。

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

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

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

pickle.dump(someObj, open("dumpFile.dmp", 'wb'), protocol=2)
或者,通过选择可用的最高协议(目前为2个)

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


您的安装和用户的安装之间的python版本和包结构是否相同?Pickle实现是独立于平台的。考虑在二进制模式下打开文件并报告新结果。
pickle.dump(someObj, open("dumpFile.dmp", 'wb'), protocol=pickle.HIGHEST_PROTOCOL)