修复Python中的ValueError: Unsupported Pickle Protocol: 3

Python中的Pickling和Unpickling

Pickling是一个将Python对象(listdict等)转化成字符流。这个字符流应该包括在另一个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

 

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)

输出:

 

修复Python中的ValueError: Unsupported Pickle Protocol: 3

 

修复 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)

输出:

 

修复Python中的ValueError: Unsupported Pickle Protocol: 3

 

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