web-dev-qa-db-ja.com

_pickle.UnpicklingError:マークが見つかりませんでした

空のセットであるメンバーparticipantsを使用してEventFrameのオブジェクト(のリスト)をpickle化するとnicodeDecodeErrorのような例外が発生しました。

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

空ではなかったので問題なかったので、まずparticipantsを何かにセットしてから漬けました。ただし、実行時にparticipantsが再び空になる場合があります。

したがって、この場合は手動でオブジェクトを削除しようとしました。その後、ピクルスを使ってもう一度捨てました。

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

次のnpicklingErrorが発生したため、これは良い選択ではないようです。

....
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()   
10
Sadik

ファイルのオフセットが先頭にないため、エラー__pickle.UnpicklingError: could not find MARK_が発生します。解決策は、ピクルをロードする前にf.seek(0)を呼び出すことです。

11
jasaarim