什么原因导致错误“_pickle.UnpicklingError: invalid load key, ' '.”?

问题描述 投票:0回答:13

我正在尝试在数组上存储 5000 个数据元素。这 5000 个元素存储在现有文件中(因此它不为空)。

但我收到错误。

在:

def array():

    name = 'puntos.df4'

    m = open(name, 'rb')
    v = []*5000

    m.seek(-5000, io.SEEK_END)
    fp = m.tell()
    sz = os.path.getsize(name)

    while fp < sz:
        pt = pickle.load(m)
        v.append(pt)

    m.close()
    return v

输出:

line 23, in array
pt = pickle.load(m)
_pickle.UnpicklingError: invalid load key, ''.
python pickle
13个回答
28
投票

pickling 是递归的,而不是顺序的。因此,要腌制一个列表,

pickle
将开始腌制包含的列表,然后腌制第一个元素……深入研究第一个元素并腌制依赖项和子元素,直到第一个元素被序列化。然后移至列表的下一个元素,依此类推,直到最终完成列表并完成对封闭列表的序列化。简而言之,除了一些特殊情况外,很难将递归 pickle 视为顺序的。如果您想以特殊方式
dump
,最好在
load
上使用更智能的图案。

最常见的泡菜,它可以用单个

dump
将所有内容腌制到文件中 - 但随后您必须使用单个
load
一次将所有内容
load
。但是,如果您打开文件句柄并执行多个
dump
调用(例如,列表中的每个元素或选定元素的元组调用一个),那么您的
load
将反映...您打开文件句柄并执行多个
load
会调用,直到您拥有所有列表元素并且可以重建列表。然而,仅选择性地
load
某些列表元素仍然不容易。为此,您可能必须使用像
dict
这样的包将列表元素存储为
klepto
(以元素或块的索引作为键),它可以将 pickled
dict
分解为多个文件透明,并且可以轻松加载特定元素。

在pickle文件中保存和加载多个对象?


28
投票

我通过以下方式解决了我的问题:

  • 删除克隆的项目
  • 安装git lfs
    sudo apt-get install git-lfs
  • 为您的用户帐户设置 git lfs:
    git lfs install
  • 再次克隆项目。

26
投票

这可能与您的具体问题无关,但是当使用

gzip
创建 pickle 存档时,我遇到了类似的问题。

例如,如果像这样制作压缩的pickle存档,

import gzip, pickle
with gzip.open('test.pklz', 'wb') as ofp:
    pickle.dump([1,2,3], ofp)

尝试打开它会引发错误

 with open('test.pklz', 'rb') as ifp:
     print(pickle.load(ifp))
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
_pickle.UnpicklingError: invalid load key, ''.

但是,如果使用

gzip
打开 pickle 文件,一切都很和谐

with gzip.open('test.pklz', 'rb') as ifp:
    print(pickle.load(ifp))

[1, 2, 3]

13
投票

如果您通过磁盘或其他方式传输这些文件,很可能它们没有正确保存。


4
投票

我在加载 pickled sklearn 模型时收到了类似的错误。问题是 pickle 是通过 sklearn.externals.joblib 创建的,我试图通过标准 pickle 库加载它。使用 joblib 解决了我的问题。


3
投票

我不完全确定您想要通过寻求特定偏移量并尝试手动加载各个值来实现什么,

pickle
模块的典型用法是:

# save data to a file
with open('myfile.pickle','wb') as fout:
    pickle.dump([1,2,3],fout)

# read data from a file
with open('myfile.pickle') as fin:
    print pickle.load(fin)

# output
>> [1, 2, 3]

如果您转储了一个列表,您将加载一个列表,无需单独加载每个项目。

您是说在寻找 -5000 偏移量之前遇到错误,也许您尝试读取的文件已损坏。

如果您有权访问原始数据,我建议您尝试将其保存到新文件并按照示例中的方式读取。


1
投票

当我将 *.p 文件上传到 Google 云端硬盘时,我遇到了类似的错误,但上下文不同。我稍后在 Google Colab 会话中尝试使用它,并收到此错误:

    1 with open("/tmp/train.p", mode='rb') as training_data:
----> 2     train = pickle.load(training_data)
UnpicklingError: invalid load key, '<'.

我通过压缩文件、上传文件然后在会话中解压缩来解决这个问题。 当您上传/下载时,pickle 文件似乎没有正确保存,因此它被损坏了。


0
投票

我刚刚遇到了由错误的pickle文件(未完全复制)引发的问题。

我的解决方案:检查pickle文件状态(损坏与否)。


0
投票

就我而言,由于多个进程尝试从同一个 pickled 文件中读取,我遇到了这个问题。其中第一个实际上创建了一个pickle(写操作),并且一些快速线程过早地开始从中读取。只需在捕获这 2 个错误时重试读取即可

EOFError, UnpicklingError
我不再看到这些错误了


0
投票

我从非常“简单”的错误中得到了这个错误,我错误地保存了我的pickle,使用to_csv而不是to_pickle:

import pandas as pd

#led to error:
df.to_csv('my_file.pkl')

#correct way:
df.to_pickle('my_file.pkl')

0
投票

简单检查:pandas 中 load_pickle() 的文件扩展名不正确。

例如,如果您的文件在光盘上名为 my_pickle.pkl,但您错误地调用了 pd.load_pickle(my_pickle.csv),则会收到此错误。


-1
投票

酸洗错误 - _pickle.UnpicklingError:无效的加载密钥,'<'.
当权重完成或权重/ Pickle 文件出现问题时,就会出现这种错误,因为权重的 UnPickling 会出现错误。


-2
投票
  1. 关闭打开的文件

    filepath = 'model_v1.pkl' with open(filepath, 'rb') as f: p = cPickle.Unpickler(f) model = p.load() f.close()

  2. 如果步骤1不起作用;重新启动会话

© www.soinside.com 2019 - 2024. All rights reserved.