无法使用pickle.load()方法读取附加数据
我写了两个脚本,分别叫做 Write.py
和 Read.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)