【发布时间】:2021-07-16 19:55:51
【问题描述】:
Python 在 python 3.4 到 3.7 中将其 pickle 协议更改为 4,并在 python 3.8 中再次将其更改为 protocol=5。如何在 python 3.8 中打开旧的腌制文件?
我试过了:
>>> 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'>
和
>>> with open('data_frame_111.pkl','rb') as pfile:
... x1 = unpkl.load(pfile, protocol=4)
但是protocol 是pickle.dump 中的一个关键字,它不是pickle.load 的一部分。实例化 pickle.Unpickler() 也不起作用。但显然应该有办法。
在 python 3.7 中,我会 import pickle5 并使用它来打开较新的泡菜,但找不到在 python 3.8 中执行相反操作的文档。
【问题讨论】:
-
我认为问题不在于泡菜版本,而是
pandas版本。pickle.load没有protocol参数,因为自动检测到协议 -
所以无法在 python3.8 中使用
pickleprotocol=4 加载腌制的熊猫数据框?看来得有办法了。虽然对象是一个数据框,但我没有在这里调用 pandas。 -
我会尝试将我的 pandas 版本升级到最新版本,看看是否能解决这个问题。还是说3.8环境下的新pandas版本不识别旧pandas版本的结构?
-
似乎是由0.23到0.24版本之间的pandas引起的。 github.com/Kaggle/docker-python/issues/519。我正在尝试使用 pandas v1.2.4 加载。
-
pickle通过加载模块然后根据腌制数据重建类对象来工作。该错误表明您的熊猫没有所需的功能 pandas.core.internals.blocks,new_block。如果您在两台机器上都获得了 pandas 版本,您可能会发现源的 pandas 比目标的 pandas 更新。解决方法是更新熊猫。
标签: python pickle python-3.8