_pickle.UnpicklingError: could not find MARK

_pickle.UnpicklingError: could not find MARK

我在使用空集成员 participants 对 EventFrame 的对象(列表)进行酸洗时引发了类似 UnicodeDecodeError 的异常.

class EventFrame:
    """Frame for an event"""
    def __init__(self, id=0):
        ...
        self.participants = set()
        ...

不为空的时候没有问题,所以我先给participants设置了个东西,然后pickle了。但是在运行时可能会发生 participants 再次被清空的情况。

所以我在这种情况下尝试手动删除对象。之后我又用泡菜把它扔掉了。

if len(frame.participants) == 0:
    frame_list.remove(frame)

这似乎不是一个好的选择,因为这个 UnpicklingError 被提出:

....
frame_list.append (pickle.load(f))
_pickle.UnpicklingError: could not find MARK

我不知道它是什么意思,也找不到任何有用的信息。

注意加载 pickle 文件时出现此错误。

这是我 picklng 和 unpickling 的方式:

f = open("myfile", "r+b")
frame_list = []
while 1:
    try:
        frame_list.append (pickle.load(f))
        frame_list = sum(frame_list, [])
    except EOFError:
        break
f.close()

倾销:

f = open("myfile", "r+b")
pickle.dump(frame_list, f)
f.close()   

错误_pickle.UnpicklingError: could not find MARK是因为文件的偏移量不在开头。解决方案是在加载 pickle 之前调用 f.seek(0)

我一开始遇到这个错误 _pickle.UnpicklingError: could not find MARK,但那是因为我在模块名称中使用了 class 名称。一旦我删除它,它就像一个魅力!