【问题标题】:Pickle , read in data , unsupported pickle protocol: 3 python 2.7Pickle,读入数据,不支持的pickle协议:3 python 2.7
【发布时间】:2018-12-06 11:12:41
【问题描述】:

这里是初学者,想读入以p结尾的数据。

我的代码如下所示:

import pickle

training_file = "/home/sk/CarND-Traffic-Sign-Classifier-Project/train.p"
testing_file = "/home/sk/CarND-Traffic-Sign-Classifier-Project/test.p"
with open(training_file, mode='rb') as f:
    train = pickle.load(f)
with open(testing_file, mode='rb') as f:
    test = pickle.load(f)

我收到以下错误:

ValueError:不支持的泡菜协议:3

有人可以指出我可以如何解决它,无论是更改协议还是以其他方式读取数据?

【问题讨论】:

  • 都是你的代码吗?
  • 缺少什么?
  • 导入pickle会出现这个错误?
  • 我更正了我的帖子,当我尝试加载数据时得到它

标签: python pickle


【解决方案1】:

当我使用 python3 创建一个泡菜文件然后尝试在 python2 中加载它时遇到了同样的问题。尝试使用 python3 运行您的程序或尝试使用 python2 创建一个 pickle 文件。

【讨论】:

【解决方案2】:

Pickle 使用不同的协议将您的数据转换为二进制流。

在 python 2 中有 3 种不同的协议(0、1、2),默认为 0。 在 python 3 中有 5 种不同的协议(0、1、2、3、4),默认为 3。 您必须在 python 3 中指定低于 3 的协议才能在 python 2 中加载数据。您可以在调用 pickle.dump 时指定协议参数。

似乎这些文件是使用 >=3(可能是 3)的协议创建的。因此,您唯一的选择是将其加载到 python 3 中,然后使用较低的协议转储它。

【讨论】:

  • 是的.. 现在安装了 python 3.5.. 当然 tensorflow 丢失了,当我尝试安装它时。它说在 2.7 中已经满意 :(:( 好像我必须再次重新安装 ubuntu :(
  • 重装ubuntu真的没必要
  • 您应该已经或可以获得 pip-3.5。当您启动 pip 命令时,它将采用链接到的人(在您的情况下似乎是 2.7)但使用 /usr/local/bin/pip3.5 然后您的命令将起作用。
  • 我不知道如何修复它,我安装了 python 3.5,当我在终端中输入 python3.5 时我可以进入它。然后我尝试了 sudo pip3 install --upgrade $TF_BINARY_URL 但是在我成功安装它并尝试导入它之后它仍然说没有模块:(
【解决方案3】:

显然,在任何 python 3 代码腌制对象中都使用了腌制协议 3。你不能在 python 2 中使用协议 3 解压。但是你可以编写一个简短的 python 3 程序来加载它,然后用协议 = 2 转储它。然后你可以在 python 2 中加载它们。

https://docs.python.org/2/library/pickle.html#usage

【讨论】:

    【解决方案4】:

    https://github.com/zopefoundation/zodbpickle

    在 Python2 下,这个包派生出 Python 2.7 的 pickle 和 cPickle 模块,增加了对协议 3 操作码的支持。

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2020-11-29
      • 1970-01-01
      • 2017-06-14
      • 2014-06-28
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多