无法加载包含腌制数据的文件 - Python .npy I/O

sof*_*ina 11 python io numpy

我正在尝试使用 np.save() 将数据框和矩阵保存为 .npy 文件,然后使用 np.load() 读取它们,但出现以下错误:

  File "/Users/sofiafarina/opt/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 457, in load
    raise ValueError("Cannot load file containing pickled data "

ValueError: Cannot load file containing pickled data when allow_pickle=False
Run Code Online (Sandbox Code Playgroud)

即使我写了 allow_pickle=True 我也会得到一个错误:

  File "/Users/sofiafarina/opt/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 463, in load
    "Failed to interpret file %s as a pickle" % repr(file))

OSError: Failed to interpret file 'finaldf_p_85_12.npy' as a pickle
Run Code Online (Sandbox Code Playgroud)

那么我怎么能从 python 脚本中保存一个 df 然后在另一个脚本中加载它呢?我应该使用其他功能吗?谢谢!

小智 14

太长了;

经过数百次搜索和几个小时的调试后,我发现问题出在 git-lfs 上,我的文件没有使用 git-lfs 拉取。

git lfs install
git lfs pull
Run Code Online (Sandbox Code Playgroud)

我认为 numpy 需要正确报告这一点


我有完全相同的问题。dtype在我的 .npz 文件中是uint8,所以不是一个对象,从技术上讲,不需要allow_pickle。我的 numpy 版本是 1.20.x

使用时出现以下情况allow_pickle=False

ValueError: Cannot load file containing pickled data when allow_pickle=False

allow_pickle=True我得到了

OSError: Failed to interpret file 'finaldf_p_85_12.npy' as a pickle


小智 6

我使用下面的语法来加载.npy文件并且它工作正常。

np.load("finaldf_p_85_12.npy",allow_pickle=True)
Run Code Online (Sandbox Code Playgroud)

我认为您需要添加allow_pickle=True参数。

  • 她已经在她的问题中指出,这将在她的情况下提示“OSError”。 (8认同)

Ada*_*rke 5

现有的答案都是有用的。请注意,当文件本身损坏时,我刚刚从其他人的 pickle 文件中收到此错误。如上所述,allow_pickle=False抱怨 pickle 被禁用,并allow_pickle=True抱怨它不是有效的 pickle 文件。在我的情况下,修复方法只是重新下载文件。


小智 2

Python 使用名为 Pickle 的本机数据序列化模块。嵌套数据(如列表列表)使用 pickle 进行序列化,NumPy 会警告不要进行 pickle。

警告:加载包含对象数组的文件使用 pickle 模块,该模块不能防止错误或恶意构造的数据。考虑传递allow_pickle=False来加载已知不包含对象数组的数据,以便更安全地处理不受信任的源。

您可能正在保存一个由单个数据帧组成的数组。这会导致酸洗。例子:

x =  array([[ 0.1,  0.1,  0.1],
       [ 0.1,  0.1,  0.1],
       [ 0.1,  0.1,  0.1],
       [ 0.1,  0.1,  0.1],
       [ 0.1,  0.1,  0.1],
       [ 0.1,  0.1,  0.1],
       [ 0.1,  0.1,  0.1]])
Run Code Online (Sandbox Code Playgroud)

在这种情况下,请尝试仅将 numpy 数组保存为np.save(filename, x[0]). 这不会使用任何酸洗来保存您的数据并解决问题。