Pickle,读取数据,不支持的Pickle协议:3 Python 2.7

6

我是一名初学者,希望能够读取以“.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: 不支持的pickle协议:3
请问有人能指出如何修复它,是更改协议还是以其他方式读取数据?

这是你的全部代码吗? - iFlo
缺少什么? - hmmmbob
通过导入pickle你遇到了这个错误? - iFlo
我更正了我的帖子,当我尝试加载数据时我明白了。 - hmmmbob
4个回答

5

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


1
有没有其他的方法? - hmmmbob
scomes提出了一个好方法。更多信息可以在这里找到[https://dev59.com/114c5IYBdhLWcg3wLXvI]。 - Degraw

3

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中,然后使用较低的协议进行转储。


1
是的..现在已经安装了Python 3.5..当然缺少了TensorFlow,当我尝试安装它时,它说已经在2.7中满足了 :(:( 看来我必须重新安装Ubuntu :( - hmmmbob
重新安装Ubuntu真的不必要。 - iFlo
你应该已经或者可以获取pip-3.5。当你启动pip命令时,它将使用链接到的那个(在你的情况下似乎是2.7),但是使用/usr/local/bin/pip3.5,然后你的命令就会起作用。 - iFlo
我不知道该如何解决它,我安装了Python 3.5,在终端中输入python3.5可以进入。然后我尝试使用sudo pip3 install --upgrade $TF_BINARY_URL命令进行安装,但是在成功安装并尝试导入后,仍然显示没有模块可用。 :( - hmmmbob

1
显然,无论是用什么Python 3代码对对象进行了pickle,都使用了pickle协议3。在Python 2中,您无法使用协议3进行反序列化。但是,您可以编写一个简短的Python 3程序,加载它并使用协议=2进行转储。然后,您就可以在Python 2中加载它们了。

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接