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

时间:2010-10-24 09:52:42

标签: python file-io dictionary pickle

我写了两个脚本Write.pyRead.py

Write.py在附加模式下打开friends.txt并获取nameemailphone no的输入,然后使用{{1}将字典转储到文件中方法,这个脚本中的每一件事都可以正常工作。

pickle.dump()在读取模式下打开Read.py,然后使用friends.txt方法将内容加载到字典中,并显示字典的内容。

主要问题是在pickle.load()脚本中,它只显示旧数据,它从不显示附加数据?

Write.py

Read.py

Read.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()

问题一定是什么,代码看起来很好。有人能指出我正确的方向吗?

感谢。

2 个答案:

答案 0 :(得分:1)

每次拨打pickle.load时,您都必须拨打pickle.dump一次。你编写例程不会在字典中添加一个条目,它会添加另一个字典。您将不得不调用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 :(得分: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)