mydata = pickle.load(myfile, "rb")
ValueError: unsupported pickle protocol: 3
很明显,有远见,如果您想用python2解压pickle文件,就必须在python3中转储pickle文件时设置protocol=2
。在
然而,如果不幸的是,您不得不使用协议3在python3中对文件进行pickle处理,而现在必须使用python2来读取这些文件,该怎么办?有什么解决办法吗?在
有一个相关的问题,但它似乎是一个不同的核心问题:unpickle OrderedDict from python3 in python2
最简单、最简单的方法是编写一个Python3脚本,使用协议3取消对所有内容的拾取,然后使用协议2重新拾取它。(考虑同时切换到camel。)
在Python 3中:
然后在Python 2中:
^{pr2}$如果您无法控制这些pickled文件的创建方式,并且必须在python2.7中加载它们,那么不幸的是,没有简单的解决方法。
也许创建这些文件的人并没有意识到python3中pickle的默认协议是“3”,但这是向后不兼容的。在
从documentation:
如果它们是一组固定的文件,那么解决方法可能是编写一个脚本,在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?
相关问题 更多 >
编程相关推荐