使用 python 3.8+(默认协议=5)时,pickle.load 在来自 python 3.7 的(协议=4)对象上失败

Mar*_*ter 13 python pickle python-3.8

Python 在 python 3.4 到 3.7 中将其 pickle 协议更改为 4,并在 python 3.8 中再次将其更改为 protocol=5。如何在 python 3.8 中打开旧的 pickled 文件?

我试过:

>>> with open('data_frame_111.pkl','rb') as pfile:
...     x1 = pickle.load(pfile)
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AttributeError: Can't get attribute 'new_block' on <module 
'pandas.core.internals.blocks' from '/opt/anaconda3/lib/python3.8/site- 
packages/pandas/core/internals/blocks.py'>
Run Code Online (Sandbox Code Playgroud)

>>> with open('data_frame_111.pkl','rb') as pfile:
...     x1 = unpkl.load(pfile, protocol=4)
Run Code Online (Sandbox Code Playgroud)

但虽然协议是一个关键字,但pickle.dump它不是pickle.load. 实例化pickle.Unpickler()也不起作用。但显然应该有办法。

在 python 3.7 中,我会import pickle5使用它来打开较新的 pickles,但找不到在 python 3.8 中执行相反操作的文档。

kim*_*ili 9

您需要升级到 pandas 的最新版本(1.3.1 对我有用)。或者,更准确地说,您执行时的 pandas 版本pickle.dump(some_path)应该与您执行时的 pandas 版本相同pickle.load(some_path)

  • 这可能是正确的答案,但它带来了严重的设计缺陷。当您使用 pickle 存储数月或数年的数据时,如果检索数据的方法取决于当时使用的代码版本,则其格式不稳定。 (3认同)