如果您无法控制这些pickle文件的创建方式,并且您必须在Python 2.7中加载它们,那么很遗憾没有简单的解决方法.
也许创建文件的人不知道Python 3中pickle的默认协议是"3",但这是向后兼容的.
从文档:
目前默认协议为3; 为Python 3.0设计的向后不兼容的协议.
如果它们是一组固定的文件,那么解决方法可能只是编写一个脚本,迭代地在Python 3.0中加载协议3 pickle文件,然后使用protocol=2
一次性修复重新编写它们.然后,您将能够在Python 2.7中阅读它们.如果将来要创建的代码需要处理的文件也要确保修改了编写这些文件的原始代码.
@Kay指出这个解决方案在实践中有多简单:我在python3中使用协议3腌制文件,现在我需要用python2解开它们,我该怎么办?
就像pickle.dump一样简单(pickle.load(sys.stdin),sys.stdout,2)
最简单和最简单的方法是编写一个Python3脚本,使用协议3解开所有内容,然后使用协议2再次重新编译它.(考虑同时切换到驼峰.)
在Python 3中:
pickle.dump(pickle.load(sys.stdin), sys.stdout, 2)
然后在Python 2中:
pickle.load(...) # This will work now in Python 2.