2010-10-24 278 views
0

我寫了兩個腳本Write.pyRead.py使用pickle.load()方法無法讀取附加數據

Write.py打開friends.txt追加模式,並採取輸入nameemailphone 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"] 

什麼一定是問題,代碼看起來很好。有人能指出我正確的方向嗎?

謝謝。

回答

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) 
+0

我從來不知道我可以通過使用'with'關鍵字來避免使用'file.close()'。非常感謝。 – Searock 2010-10-24 10:01:25

+0

@Searock - 是的,你有一個明確縮進的塊,文件打開。只需快速閱讀你所需要的一切,它就會結束。 – eumiro 2010-10-24 10:02:23

+0

如何使用'pickle.load()'將字典與鍵作爲名稱進行追加。它給了我這個字典錯誤'AttributeError:'dict'object has no attribute'append'' – Searock 2010-10-24 10:33:41

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)) 

要將值加載到一個字典,你會怎麼做:

​​