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 文件,跳过尽可能多的对象并删除所有对象直到下一个 .
。
我有一个 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 文件,跳过尽可能多的对象并删除所有对象直到下一个 .
。