Pickle,读入数据,不支持的pickle协议:3 python 2.7

时间:2016-12-22 12:48:51

标签: python pickle

初学者,想要读取带有文件结尾的数据

我的代码如下所示:

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

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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中,然后使用较低的协议转储它。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

https://github.com/zopefoundation/zodbpickle

在Python2下,此软件包会分叉Python 2.7的pickle和cPickle模块,从而增加了对协议3操作码的支持。