您好,我正在學習 Python 并嘗試將命令列通訊簿創建為,并使用(即簡報)將dictionary其保存到檔案中。pickle
我已經撰寫了add_contactandbrowse_contact函式,它們都運行良好。我添加了一些聯系人(他們的名字只是“測驗一”、“測驗二”......“測驗十”)以及他們的電子郵件和電話號碼到通訊簿。
但是,當我撰寫search_contactandmodify_contact函式時,我需要將檔案重新加載到dictionaryusing 中pickle.load()。
問題是,由于每個聯系人都是一個一個添加到通訊錄中,如果我簡單地使用下面的代碼,它只會回傳通訊錄中的第一個物件:
with open("addressbook.data", "rb") as f:
loaded_contacts = pickle.load(f)
print(loaded_contacts)
輸出:
{'Test One': ('[email protected]', '39893849')}
那是因為“Pickle 一次序列化一個物件,并讀回一個物件”。根據此處建議的解決方案,我已更改為以下代碼,因此我可以將所有物件加載回名為的字典中loaded_contacts:
with open("addressbook.data", "rb") as f:
while True:
try:
loaded_contacts = print(pickle.load(f))
except EOFError:
break
這似乎可行,但是從檔案中加載的字典最后會有一個額外的None物件,如下所示一旦loaded_contacts列印出來:
{'Test One': ('[email protected]', '39893849')}
{'Test Two': ('[email protected]', '93294798374')}
.
.
.
{'Test Ten': ('[email protected]', '79854399')}
None
因此,當我嘗試搜索“Test One”之類的名稱并嘗試檢索其值時,我會得到,因為末尾TypeError: 'NoneType' object is not subscriptable有一個物件。None
這是代碼(它需要更多的作業,但你會明白的):
with open("addressbook.data", "rb") as f:
while True:
try:
loaded_contacts = print(pickle.load(f))
except EOFError:
break
search_name = input("Please enter a name: ")
print(loaded_contacts[search_name])
這是我輸入名稱后的錯誤訊息:
TypeError Traceback (most recent call last)
/var/.../x.py in <module>
11
12 search_name = input("Please enter a name: ")
---> 13 print(loaded_contacts[search_name])
14
TypeError: 'NoneType' object is not subscriptable
不知道我做錯了什么,或者為什么None在加載的字典末尾有一個額外的物件(或者如何洗掉它)。我知道我可以使用一個串列將所有值存盤為字串,但簡報是創建一個dictionary來保存所有值并使用dictionary built-in methods來添加、洗掉和修改聯系人——因此我的問題在這里。
編輯更新:
回答問題(感謝@JohnGordon 和@ewong):
在loaded_contacts = print(pickle.load(f)),print()不會回傳任何東西,因此將變數分配給print()將回傳Noun。
但是,簡單地洗掉print()不會完全起作用——它解決了“無”問題,但loaded_contacts只會分配給pickle.load(f).
以下是如何迭代所有物件pickle.load(f)(如果它們最初是一個接一個添加的),然后將它們全部存盤在 a 中dictionary:
loaded_contacts = {} # create an empty dictionary
with open("addressbook.data", "rb") as f: # open the file
while True: # looping pickle.load(f)
try:
# add each object to the dictionary
loaded_contacts.update(pickle.load(f))
except EOFError:
break # stop looping at the end of the file
uj5u.com熱心網友回復:
loaded_contacts = print(pickle.load(f))
這是你的問題。您將 loaded_contacts 分配給 的回傳值 print(),它不回傳任何內容,因此None默認情況下回傳。
改為這樣做:
loaded_contacts = pickle.load(f)
print(loaded_contacts)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/458899.html
上一篇:如何在顫振中打開pdf檔案?
