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

时间:2016-01-02 21:48:46

标签: python python-2.7 pickle

mydata = pickle.load(myfile, "rb")
ValueError: unsupported pickle protocol: 3

这与:ValueError: unsupported pickle protocol: 3, python2 pickle can not load the file dumped by python 3 pickle?

有关

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

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

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

2 个答案:

答案 0 :(得分:7)

如果您无法控制这些pickle文件的创建方式,并且必须在Python 2.7中加载它们,那么很遗憾没有简单的解决方法。

创建文件的人可能并不知道Python 3中pickle的默认协议是“3”,但这是向后兼容的。

来自documentation

  

目前默认协议为3;为Python 3.0设计的向后不兼容的协议。

如果它们是一组固定的文件,那么解决方法可能只是编写一个脚本,迭代地在Python 3.0中加载协议3 pickle文件,然后使用protocol=2重新编写它们作为一次性修复。然后,您将能够在Python 2.7中阅读它们。如果将来要创建的代码需要处理的文件也要确保修改了编写这些文件的原始代码。

@Kay指出此解决方案在实践中有多简单:I have pickled files using protocol 3 in python3, and now I need to unpickle them with python2, what can I do?

  

和pickle.dump一样简单(pickle.load(sys.stdin),sys.stdout,2)

答案 1 :(得分:7)

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

在Python 3中:

pickle.dump(pickle.load(sys.stdin), sys.stdout, 2)

然后在Python 2中:

pickle.load(...) # This will work now in Python 2.