我在python3中使用协议3对文件进行了pickle,现在我需要用python2取消pickle,我能做什么?

2024-04-27 00:12:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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?

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

然而,如果不幸的是,您不得不使用协议3在python3中对文件进行pickle处理,而现在必须使用python2来读取这些文件,该怎么办?有什么解决办法吗?在

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


Tags: 文件thenotloadmyfileprotocolcanpickle
2条回答

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

在Python 3中:

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

然后在Python 2中:

^{pr2}$

如果您无法控制这些pickled文件的创建方式,并且必须在python2.7中加载它们,那么不幸的是,没有简单的解决方法。

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

documentation

Currently the default protocol is 3; a backward-incompatible protocol designed for Python 3.0.

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

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

As easy as pickle.dump(pickle.load(sys.stdin), sys.stdout, 2)

相关问题 更多 >