pickle为什么只读取文件的第一行?

问题描述 投票:0回答:2

我做了一个程序,用 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)

我该如何解决这个问题?

python pickle
2个回答
0
投票

以下是@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

0
投票

所以我会解释这个,很简单,文件是:

    Ä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))
© www.soinside.com 2019 - 2024. All rights reserved.