cPickle:UnpicklingError:无效的加载密钥,' A'

时间:2016-10-03 11:09:52

标签: python python-2.7 pickle

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

这是酸洗的代码:

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。如果我尝试使用pickle进行unpickle,我会收到以下错误:

  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'

1 个答案:

答案 0 :(得分:1)

当存储多个对象时(通过重复log(u::MyCube) = log(u.h * u.w * u.l) 而不是来自容器),Pickle将在pickle文件中按顺序存储对象,因此如果对象被破坏,则可以删除它而不会破坏其他对象。

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

pickle文件的可读性取决于它的pickle格式 - 0是可行的,上面的所有内容都是困难。您是否可以修复或必须删除完全取决于此。一致的是,每个单独的泡菜都以点(pickle.py)结尾。例如,.b'Va\np0\n.'都是字符'“a”',但在协议0和4中。

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

b'\x80\x04\x95\x05\x00\x00\x00\x00\x00\x00\x00\x8c\x01a\x94.'

然后打开pickle文件,跳过尽可能多的对象并将所有内容移除到下一个with open('/my/pickle.pkl', 'rb') as pkl_source: idx = 1 while True: pickle.load(pkl_source) print(idx) idx += 1