cPickle: UnpicklingError: invalid load key, 'A'

cPickle: UnpicklingError: invalid load key, 'A'

我有一个 pickle 文件,它在解包时抛出一个 UnpicklingError: invalid load key, 'A'. 异常。无论我是尝试在生成文件的 Ubuntu 14.04 机器上还是在我的 Windows 机器上分析它,都会抛出异常。它包含 26 个数据点,在数据点 11 之后抛出异常。我怀疑我一定是不小心以某种方式编辑了该文件,尽管我不知道何时或如何编辑该文件。我知道还有其他一些关于此类错误的讨论,但到目前为止我还没有找到 post 告诉我是否以及如何在错误输入后恢复值(我怀疑其中一个值只是无法挽回地丢失了)。有什么办法可以跳过它并继续解开下一个?可以吗?反方向解开,即先最后一个元素?然后我可以向后工作,直到我找到错误的条目,从而获得其他值。 (我可以重新生成数据,但这需要一两天的时间,所以如果可以的话,我宁愿避免这样做。)

这是 pickling 的代码:

with open('hist_vs_years2.pkl', 'ab') as hist_pkl:
        pickle.dump(hist, hist_pkl, -1)

这是 unpickling 的代码:

hist_vs_samples2 = []
more_values = True

with open('hist_vs_years2.pkl', 'rb') as hist_vs_samples_pkl:
    while more_values == True:
        try:
            hist_vs_samples2.append(pickle.load(hist_vs_samples_pkl))
        except EOFError:
            more_values = False

我应该补充一点,我正在使用 cPickle。如果我尝试使用泡菜解泡,我会收到以下错误:

  File "C:\Anaconda2\lib\pickle.py", line 1384, in load
    return Unpickler(file).load()

  File "C:\Anaconda2\lib\pickle.py", line 864, in load
    dispatch[key](self)

KeyError: 'A'

当存储多个对象时(通过重复 dump,而不是来自容器)Pickle 将按顺序将对象存储在 pickle 文件中,因此如果一个对象损坏,可以将其删除而不会损坏其他对象。

原则上,pickle 格式在 pickle.py 中伪记录。对于大多数情况,模块开头的操作码足以拼凑出正在发生的事情。基本上,pickle 文件是关于如何构建对象的说明。

pickle 文件的可读性取决于它的 pickle 格式 - 0 是可行的,上面的一切都是 困难。您是否可以修复或必须删除完全取决于此。一致的是每个泡菜都以点 (.) 结尾。例如,b'Va\np0\n.'b'\x80\x04\x95\x05\x00\x00\x00\x00\x00\x00\x00\x8c\x01a\x94.'都是字符'"a"',但是在协议0和4中。

最简单的恢复形式是计算您可以加载的对象数量:

with open('/my/pickle.pkl', 'rb') as pkl_source:
    idx = 1
    while True:
        pickle.load(pkl_source)
        print(idx)
        idx += 1

然后打开 pickle 文件,跳过尽可能多的对象并删除所有对象直到下一个 .