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()
或者转储到新文件,然后用新文件替换原始文件。 (您也可以在最后查找、转储然后截断以清除所有尾随垃圾,而不是继续查找、截断、转储。)
我正在尝试执行一项简单的任务:
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()
或者转储到新文件,然后用新文件替换原始文件。 (您也可以在最后查找、转储然后截断以清除所有尾随垃圾,而不是继续查找、截断、转储。)