是什么导致错误"_pickle.UnpicklingError:无效加载密钥,''."?

Xce*_*ion 13 python pickle

我正在尝试在阵列上存储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
Run Code Online (Sandbox Code Playgroud)

OUT:

line 23, in array
pt = pickle.load(m)
_pickle.UnpicklingError: invalid load key, ''.
Run Code Online (Sandbox Code Playgroud)

小智 35

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

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

  • 适用于从 HuggingFace 或其他资源下载的机器学习模型。 (4认同)
  • 只是添加评论。我从 github 下载了一个大文件 - 并遇到错误消息“_pickle.UnpicklingError:无效的加载密钥”。后来发现大文件坏了。我需要再次下载并确保“sha256sum”相同 (3认同)

Mik*_*rns 10

酸洗是递归的,而不是顺序的.因此,为了挑选一个列表,pickle将开始挑选包含列表,然后挑选第一个元素...潜入第一个元素并腌制依赖项和子元素,直到第一个元素被序列化.然后转到列表的下一个元素,依此类推,直到它最终完成列表并完成序列化封闭列表.简而言之,除了一些特殊情况外,很难将递归的pickle视为顺序.dump如果您想以load特殊方式使用,最好使用更智能的模式.

最常见的泡菜,它用一个dump文件来腌制所有东西- 但是你必须用一个文件load一次性完成所有事情load.但是,如果你打开一个文件句柄并进行多次dump调用(例如,列表的每个元素一个,或者所选元素的元组),那么你load将镜像...你打开文件句柄并进行多次load调用直到你拥有所有的列出元素并可以重建列表.load然而,选择性地仅选择某些列表元素仍然不容易.要做到这一点,您可能必须将列表元素存储为dict(使用元素或块的索引作为键),使用透明的文件包到几个文件中,并且可以轻松加载特定元素.klepto,这可以分解一个pickledict

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


小智 10

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

  • 真的很有帮助。拯救了我的一天。我花了一个小时摸索着创造新环境。:) (3认同)
  • 这发生在我身上。我在两个进程之间共享内存,并使用 pickle 连续从该内存读取数据/向该内存写入数据。不幸的是,我忘记使用锁,所以我最终遇到了一个竞争条件,其中“pickle.loads()”有时会失败,因为数据已损坏(即它被其他进程覆盖时被读取)。 (2认同)

mis*_*haF 5

这可能与您的特定问题无关,但是当使用创建咸菜档案时,我遇到了类似的问题gzip

例如,如果像这样制作一个压缩的泡菜档案,

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

尝试打开它会引发错误

 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, ''.
Run Code Online (Sandbox Code Playgroud)

但是,如果打开泡菜文件,gzip所有文件都会和谐

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

[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)