Python:更新序列化对象

时间:2016-09-02 19:44:18

标签: python serialization deserialization pickle

我正在尝试执行一项简单的任务:
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()不会使用新列表backup.p覆盖['string']的内容?我是否必须删除buckup.p才能获得所需的行为?

1 个答案:

答案 0 :(得分:3)

之后:

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

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

pickle.dump(l, f)

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

f.seek(0)
f.truncate()

或转储到新文件,然后用新文件替换原始文件。 (你也可以寻找,转储,然后在最后截断以清除任何尾随垃圾,而不是寻求,截断,转储。)