修复Python中的ValueError: Unsupported Pickle Protocol: 3
Python中的Pickling和Unpickling
Pickling
是一个将Python对象(list
、dict
等)转化成字符流。这个字符流应该包括在另一个Python脚本中使用称为Unpickling
的反向过程重新创建对象所需的所有数据。
pickle
模块在Python中执行pickle和unpickle。
在下面的代码中,我们已经pickle和unpickle了一个列表。我们已经创建了一个名称列表,并使用wb
模式打开了文件。
w
将创建一个文件,如果它还不存在,b
将以字节流的形式将数据(列表)写入文件。我们调用了dump()
方法,指定了要转储的列表和要以字节形式写入数据的文件名。
类似地,我们通过首先在rb
模式下从文件中阅读数据来解嵌数据。使用load()
方法,我们从文件中读取字节并将它们转换回列表对象。
示例代码:
#Python 3.x
import pickle
my_list = ['Jhon', 'Alia', 'Sam', 'Chris']
with open('my_file.txt', 'wb') as f:
pickle.dump(my_list, f)
my_file = open ("my_file.txt", "rb")
data = pickle.load(my_file)
print(data)
输出(Run on Anaconda’s Jupyter Notebook):

Python中 ValueError: unsupported pickle protocol: 3
原因
有时在unpickling的过程中,我们会遇到ValueError: unsupported pickle protocol: 3
。这是由于在pickle和unpickle数据期间使用了不兼容的pickle协议。
Python 3引入并默认使用protocol 3来pickle和unpickle数据,如果我们没有指定协议的话。如果我们使用不同的协议pickle和unpickle数据,我们将面临这个错误,如下面的代码所示。
Python 2默认使用协议0,Python 3使用协议3。因此,当我们在没有正确指定协议版本的情况下,在不同的Python版本中pickle和unpickle数据时,通常会遇到这个错误。
示例代码:
Python 3:
#Python 3.x
import pickle
my_list = ['Jhon', 'Alia', 'Sam', 'Chris']
with open('my_file.txt', 'wb') as f:
pickle.dump(my_list, f)
Python 2:
#Python 2.x
import pickle
my_file = open ("my_file.txt", "rb")
data = pickle.load(my_file)
print(data)
输出:

修复 ValueError: unsupported pickle protocol: 3
在Python中
为了解决这个错误,当我们使用Python 3转储数据以在Python 2中加载这些数据时,我们必须指定小于3
的pickle协议。因为Python 2不支持大于2的协议。
示例代码:
#Python 3.x
import pickle
my_list = ['Jhon', 'Alia', 'Sam', 'Chris']
with open('my_file.txt', 'wb') as f:
pickle.dump(my_list, f, protocol=2)
示例代码:
#Python 2.x
import pickle
my_file = open ("my_file.txt", "rb")
data = pickle.load(my_file)
print(data)
输出:

这里,字符串前的u
表示Unicode。