数值错误: 不支持的pickle协议: 3,python2的pickle无法加载由python3 pickle转储的文件?

107
我在Python 3中使用pickle将一个文件转储,然后在Python 2中使用pickle来加载该文件时出现了ValueError错误。 所以,Python 2的pickle无法加载Python 3的pickle转储文件?如果我想要这样做,应该怎么办?

5
如果您卡在已经编写的腌制文件中,那么请查看:http://stackoverflow.com/questions/34571063/i-have-pickled-files-using-protocol-3-in-python3-and-now-i-need-to-unpickle-the/34571081#34571081 - rysqui
2个回答

167
在Python 3中,您应该使用较低的协议号编写腌制数据。Python 3引入了一个新的协议,编号为3(并将其用作默认值),因此请切换回可以被Python 2读取的2值。

检查pickle.dump中的protocol参数。您的代码应如下所示。
pickle.dump(your_object, your_file, protocol=2)

pickle.load中没有protocol参数,因为pickle可以从文件中确定协议。


57

Pickle使用不同的协议将您的数据转换为二进制流。

您必须在Python 3中指定一个低于3的协议才能够在Python 2中加载数据。在调用pickle.dump时,您可以指定protocol参数。


13
仅供以后参考,显然在Python 3.8中引入了一个协议“5”,与早期版本不兼容。 - Farzad Abdolhosseini
关于协议5的回复 https://www.python.org/dev/peps/pep-0574/ - Caleb Syring

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