【问题标题】:I have pickled files using protocol 3 in python3, and now I need to unpickle them with python2, what can I do?我在 python3 中使用协议 3 腌制了文件,现在我需要用 python2 解压缩它们,我该怎么办?
【发布时间】:2016-04-06 21:07:09
【问题描述】:
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 时设置protocol=2

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

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

【问题讨论】:

  • 协议记录在 PEP 中。如果它不使用需要 Python 3 的自定义类,那么您可以轻松地自己实现它。

标签: python python-2.7 pickle


【解决方案1】:

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

也许创建文件的人不知道 Python 3 中 pickle 的默认协议是“3”这一事实,但这是向后不兼容的。

来自documentation

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

如果它们是一组固定的文件,那么解决方法可能是编写一个脚本,在 Python 3.0 中迭代加载协议 3 腌制文件,然后使用 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)一样简单

【讨论】:

    【解决方案2】:

    最简单和最简单的方法是编写一个 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.
    

    【讨论】:

    • 正确答案,IMO。就像pickle.dump(pickle.load(sys.stdin), sys.stdout, 2) 一样简单
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2012-10-12
    • 2013-11-14
    相关资源
    最近更新 更多