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

新手上路,请多包涵

我正在尝试将 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, ''.

原文由 Xcecution 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

酸洗是递归的,而不是顺序的。因此,要 pickle 一个列表, pickle 将开始 pickle 包含列表,然后 pickle 第一个元素……深入到第一个元素并 pickle 依赖项和子元素,直到第一个元素被序列化。然后移动到列表的下一个元素,依此类推,直到它最终完成列表并完成对封闭列表的序列化。简而言之,除了某些特殊情况外,很难将递归 pickle 视为顺序的。最好在你的 dump 上使用更智能的模式,如果你想 load 以一种特殊的方式。

最常见的 pickle,它用一个 dump 将所有东西腌制到一个文件中 -- 但是你必须 load 一次用一个 load 但是,如果您打开一个文件句柄并执行多个 dump 调用(例如,一个用于列表的每个元素,或一个选定元素的元组),那么您的 load 将反映…您打开文件句柄并执行多个 load 调用,直到您拥有所有列表元素并可以重建列表。但是,选择性地 load 仅某些列表元素仍然不容易。为此,您可能必须使用类似 klepto 的包将列表元素存储为 dict (以元素或块的索引作为键),它可以将 dict 透明地分解成几个文件,并可以轻松加载特定元素。

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

原文由 Mike McKerns 发布,翻译遵循 CC BY-SA 3.0 许可协议

这可能与您的具体问题无关,但是当使用 gzip 创建 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 打开泡菜文件—一切都很和谐

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

[1, 2, 3]

原文由 mishaF 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题