我已经在python3中使用协议3对文件进行了腌制,现在我需要使用python2对其进行腌制,该怎么办?


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

这与以下内容有关:ValueError:不支持的pickle协议:3,python2 pickle不能加载python 3
pickle丢弃的文件吗?

显然,具有远见卓识的您必须设置protocol=2将腌制文件转储到python3中的时间,如果您希望能够使用python2解腌它。

但是,如果不幸的是您被卡在使用协议3在python 3中腌制的文件又现在必须使用python2读取它们怎么办?有什么解决方法吗?

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


问题答案:

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

也许创建文件的人没有意识到Python 3中pickle的默认协议是“ 3”,但这是向后不兼容的。

文档中

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

如果它们是一组固定的文件,那么一种解决方法可能是编写一个脚本,该脚本以迭代方式在Python
3.0中加载协议3腌制的文件,然后将其protocol=2用作一次性修复程序重新编写。然后,您将能够在Python
2.7中阅读它们。如果要创建一些将来的文件需要处理的文件,还请确保修改写入这些文件的原始代码。

@Kay指出此解决方案在实践中有多简单:我已经在python3中使用协议3腌制了文件,现在我需要使用python2对其进行修复,该怎么办?

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