无法使用pickle.load()方法读取附加数据

0 投票
2 回答
3258 浏览
提问于 2025-04-16 06:00

我写了两个脚本,分别叫做 Write.pyRead.py

Write.py 这个脚本是用来打开一个叫 friends.txt 的文件,模式是追加,也就是说可以在文件的末尾加内容。它会让你输入 name(名字)、email(邮箱)和 phone no(电话号码),然后把这些信息放进一个字典里,最后用 pickle.dump() 方法把字典的内容写入文件。这个脚本运行得很好,没有问题。

Read.py 这个脚本则是打开 friends.txt 文件,模式是读取,它会用 pickle.load() 方法把文件里的内容加载到一个字典中,并显示这个字典的内容。

主要的问题出在 Read.py 这个脚本上,它只显示旧的数据,从来没有显示过新加的数据?

Write.py

#!/usr/bin/python

import pickle

ans = "y"
friends={}
file = open("friends.txt", "a")
while ans == "y":
    name = raw_input("Enter name : ")
    email = raw_input("Enter email : ")
    phone = raw_input("Enter Phone no : ")

    friends[name] = {"Name": name, "Email": email, "Phone": phone}

    ans = raw_input("Do you want to add another record (y/n) ? :")

pickle.dump(friends, file)
file.close()

Read.py

#!/usr/bin/py

import pickle

file = open("friends.txt", "r")

friend = pickle.load(file)

file.close()

for person in friend:
    print friend[person]["Name"], "\t", friend[person]["Email"] , "\t", friend[person]["Phone"]

问题可能出在哪里呢?代码看起来没什么问题。有人能给我指个方向吗?

谢谢。

2 个回答

1

你每次用 pickle.dump 保存数据时,都需要用 pickle.load 读取一次。你写的程序并不是把一个新条目加到字典里,而是又加了一个字典。你需要不断调用 pickle.load,直到把整个文件都读完,但这样会得到好几个字典,你还得把它们合并起来。其实更简单的方法是把数据存成CSV格式,这样做起来很简单:

with open("friends.txt", "a") as file:
    file.write("{0},{1},{2}\n".format(name, email, phone))

要把这些值加载到字典里,你可以这样做:

with open("friends.txt", "a") as file:
    friends = dict((name, (name, email, phone)) for line in file for name, email, phone in line.split(","))
1

你需要从文件中多次加载数据。每次写入的过程都是独立的,互不影响,所以每次写入都会在文件中创建一个独立的数据块。如果你之后去读取这些数据,它一次只能读取一个数据块。所以你可以试试下面的代码:

import pickle

friend = {}
with open('friends.txt') as f:
    while 1:
        try:
            friend.update(pickle.load(f))
        except EOFError:
            break # no more data in the file

for person in friend.values():
    print '{Name}\t{Email}\t{Phone}'.format(**person)

撰写回答