初学者,想要读取带有文件结尾的数据
我的代码如下所示:
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
有人可以指出我如何修复它,无论是更改协议还是以其他方式读取数据?
答案 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中加载它们。
答案 3 :(得分:0)
https://github.com/zopefoundation/zodbpickle
在Python2下,此软件包会分叉Python 2.7的pickle和cPickle模块,从而增加了对协议3操作码的支持。