我在python3中使用协议3腌制文件,现在我需要用python2解开它们,我该怎么办?

rys*_*qui 2 python pickle python-2.7

mydata = pickle.load(myfile, "rb")
ValueError: unsupported pickle protocol: 3
Run Code Online (Sandbox Code Playgroud)

这与以下内容有关:ValueError:不支持的pickle协议:3,python2 pickle无法加载python 3 pickle转储的文件?

很明显,有远见,你必须设置protocol=2何时在python3中转储你的pickle文件,如果你想能够用python2解开它.

但是,如果您不幸地遇到使用协议3在python 3中腌制的文件,现在您必须使用python2读取它们呢?有没有解决方法?

有一个相关的问题,但它似乎是一个不同的核心问题:在python2中从python3 unpickle OrderedDict

rys*_*qui 7

如果您无法控制这些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)


zwo*_*wol 7

最简单和最简单的方法是编写一个Python3脚本,使用协议3解开所有内容,然后使用协议2再次重新编译它.(考虑同时切换到驼峰.)

在Python 3中:

pickle.dump(pickle.load(sys.stdin), sys.stdout, 2)
Run Code Online (Sandbox Code Playgroud)

然后在Python 2中:

pickle.load(...) # This will work now in Python 2.
Run Code Online (Sandbox Code Playgroud)

  • 正确答案,IMO.就像`pickle.dump(pickle.load(sys.stdin),sys.stdout,2)一样简单` (4认同)