空のセットであるメンバー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()
ファイルのオフセットが先頭にないため、エラー__pickle.UnpicklingError: could not find MARK
_が発生します。解決策は、ピクルをロードする前にf.seek(0)
を呼び出すことです。