我做了一个程序,用 Pickle 将一些数据存储到一个文件中
这是文件的样子:
ÄX
(7836)q.ÄX
(13289)q.ÄX
(0928)q.ÄX
(26)q.ÄX
(7893)q.ÄX
(3883)q.ÄX
(1982)q.ÄX
是什么并不重要
但是当我尝试阅读它时:
data = pickle.load(open("num.txt", "rb"))
print(data)
这是输出:
(7836)
而预期结果是:
(7836)
(13289)
(0928)
(26)
(7893)
(3883)
(1982)
我该如何解决这个问题?
以下是@jsbueno 的回答,对我有用。可以在here +更多答案中找到。
Pickle一次序列化单个对象,读回单个对象——pickle数据按顺序记录在文件上
如果你只是做 pickle.load 你应该读取第一个序列化到文件中的对象(而不是你写的最后一个)。
反序列化第一个对象后,文件指针位于下一个对象的开头 - 如果您再次调用 pickle.load,它将读取下一个对象 - 这样做直到文件结束。
objects = []
with (open("myfile", "rb")) as openfile:
while True:
try:
objects.append(pickle.load(openfile))
except EOFError:
break
所以我会解释这个,很简单,文件是:
ÄX
(7836)q.ÄX
(13289)q.ÄX
(0928)q.ÄX
(26)q.ÄX
(7893)q.ÄX
(3883)q.ÄX
(1982)q.ÄX
当你给
print(pickle.load(File1))
输出为:
(7836)
但是当你给予
print(pickle.load(File1))
print(pickle.load(File1))
print(pickle.load(File1))
输出为:
(7836)
(13289)
(0928)
所以事情是 pickle.load 一次只读取一行所以我建议你找到文件的行数,只需在 '.' 处拆分即可。就像我在下面给出的一样,并使用 for 循环逐行加载
f1=open("File1.dat")
file_contents=str(f1.read())
list_of_records=file_contents.split('.')
no_of_records=len(list_of_records)-1
f1.seek(0)
for i in range(no_of_records):
print(pickle.load(f1))