Python: 更新序列化对象

Python: Update serialized object

我正在尝试执行一项简单的任务:
1.反序列化之前序列化的对象
2.更新这个对象
3. 将其序列化以备后用

我尝试用 pickle 做到这一点,但没有成功。
我首先这样做:

empty_list = []
f = open('backup.p', 'wb')
pickle.dump(empty_list, f)
f.close()

及以后:

f =  open('backup.p', 'rb+')
l = pickle.load(f)
l.append('string')
pickle.dump(l, f)
f.close()

但是当我尝试再次加载应该更新的列表时:

f = open('backup.p', 'rb')
updated_list = pickle.load(f)
print(updated_list)  # prints [] instead of ['string']
f.close()

为什么第二次调用 dump() 不使用新列表 ['string'] 覆盖 backup.p 的内容?我是否必须删除 buckup.p 才能获得所需的行为?

在此之后:

f =  open('backup.p', 'rb+')
l = pickle.load(f)

您已将文件对象 f 定位在文件中 empty_list 的 pickle 之后的某个位置。这意味着当您将另一个对象转储到文件时:

pickle.dump(l, f)

新的 pickle 在第一个 pickle 之后写入。您需要通过在转储新泡菜之前清除文件来避免这种情况:

f.seek(0)
f.truncate()

或者转储到新文件,然后用新文件替换原始文件。 (您也可以在最后查找、转储然后截断以清除所有尾随垃圾,而不是继续查找、截断、转储。)