pickle.load 在使用 python 3.8+(默认协议=5)时,来自 python 3.7 的(协议=4)对象失败
pickle.load fails on (protocol=4) objects from python 3.7 when using python 3.8+ (with default protocol=5)
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'>
和
>>> with open('data_frame_111.pkl','rb') as pfile:
... x1 = unpkl.load(pfile, protocol=4)
但是协议是 pickle.dump
中的关键字,它不是 pickle.load
的一部分。实例化 pickle.Unpickler()
也不起作用。不过显然应该有办法。
在 python 3.7 中,我会 import pickle5
并用它来打开较新的泡菜,但找不到在 python 3.8 中进行相反操作的文档。
with open('data_frame_111.pkl','rb') as pfile:
x1 = pickle.load(pfile)
尝试更改为:
import pandas as pd
with open('data_frame_111.pkl','rb') as pfile:
x1 = pd.read_pickle(pfile)
由于安全漏洞问题,似乎已经进行了一些更改。
您需要升级到 pandas 的最新版本(1.3.1 对我有用)。或者,更准确地说,您执行 pickle.dump(some_path)
时的 pandas 版本应该与您执行 pickle.load(some_path)
.
时的 pandas 版本相同
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'>
和
>>> with open('data_frame_111.pkl','rb') as pfile:
... x1 = unpkl.load(pfile, protocol=4)
但是协议是 pickle.dump
中的关键字,它不是 pickle.load
的一部分。实例化 pickle.Unpickler()
也不起作用。不过显然应该有办法。
在 python 3.7 中,我会 import pickle5
并用它来打开较新的泡菜,但找不到在 python 3.8 中进行相反操作的文档。
with open('data_frame_111.pkl','rb') as pfile:
x1 = pickle.load(pfile)
尝试更改为:
import pandas as pd
with open('data_frame_111.pkl','rb') as pfile:
x1 = pd.read_pickle(pfile)
由于安全漏洞问题,似乎已经进行了一些更改。
您需要升级到 pandas 的最新版本(1.3.1 对我有用)。或者,更准确地说,您执行 pickle.dump(some_path)
时的 pandas 版本应该与您执行 pickle.load(some_path)
.