【问题标题】:_pickle.UnpicklingError: could not find MARK_pickle.UnpicklingError: 找不到标记
【发布时间】:2016-03-08 22:14:35
【问题描述】:

当使用一个空集的成员 participants 腌制 EventFrame 的(列表)对象时,我遇到了像 UnicodeDecodeError 这样的异常。

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

当它不为空时,没有问题,所以我先将 participants 设置为某个东西,然后对其进行腌制。但在运行期间,可能会发生 participants 再次被清空。

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

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

这似乎不是一个好的选择,因为引发了这个 UnpicklingError

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

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

注意在加载 pickle 文件时会引发此错误。

这是我腌制和解封的方式:

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()   

【问题讨论】:

  • 我必须删除文件并创建新文件,然后再次转储 frame_list。那行得通。

标签: python pickle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我遇到了类似的错误,我怀疑这与我的命名选择有关。您使用的是完全相同的名称吗?你能多分享一点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多