我创建了一些数据并将其存储了几次,如下所示:
with open('filename', 'a') as f:
pickle.dump(data, f)
每次文件大小增加,但是当我打开文件时
with open('filename', 'rb') as f:
x = pickle.load(f)
我只能看到上次的数据。如何正确读取文件?
我创建了一些数据并将其存储了几次,如下所示:
with open('filename', 'a') as f:
pickle.dump(data, f)
每次文件大小增加,但是当我打开文件时
with open('filename', 'rb') as f:
x = pickle.load(f)
我只能看到上次的数据。如何正确读取文件?
Answers:
Pickle一次序列化一个对象,然后读回一个对象-腌制的数据按顺序记录在文件上。
如果您只是简单地这样做pickle.load
,则应该读取序列化到文件中的第一个对象(而不是您编写的最后一个对象)。
对第一个对象进行反序列化后,文件指针位于下一个对象的开头-如果您pickle.load
再次调用,它将读取下一个对象-这样做直到文件结束。
objects = []
with (open("myfile", "rb")) as openfile:
while True:
try:
objects.append(pickle.load(openfile))
except EOFError:
break
以下是如何编写和读取pickle文件的示例。请注意,如果您继续将泡菜数据附加到文件中,则需要继续从文件中读取数据,直到找到所需的内容或到达文件末尾而产生异常为止。那就是最后一个函数的作用。
import os
import pickle
PICKLE_FILE = 'pickle.dat'
def main():
# append data to the pickle file
add_to_pickle(PICKLE_FILE, 123)
add_to_pickle(PICKLE_FILE, 'Hello')
add_to_pickle(PICKLE_FILE, None)
add_to_pickle(PICKLE_FILE, b'World')
add_to_pickle(PICKLE_FILE, 456.789)
# load & show all stored objects
for item in read_from_pickle(PICKLE_FILE):
print(repr(item))
os.remove(PICKLE_FILE)
def add_to_pickle(path, item):
with open(path, 'ab') as file:
pickle.dump(item, file, pickle.HIGHEST_PROTOCOL)
def read_from_pickle(path):
with open(path, 'rb') as file:
try:
while True:
yield pickle.load(file)
except EOFError:
pass
if __name__ == '__main__':
main()
我开发了一个软件工具,可以直接在您的浏览器中打开(大多数)Pickle文件(什么都不会转移,因此它是100%私有的):
open('filename', 'wb')