2013-10-23 135 views
1

我有以下代碼:字典KeyError異常

def search_for_person(name): 
    with open("address.txt", "r") as book: 
     records = re.split("[-]+", book.read(), re.M) 
     for data in records: 
      record = get_record(data) 
      if record['Name'] == name: 
       print record 


def get_record(string): 
    return dict(re.findall("^(.*): (.*)$", string, re.M)) 

當我用它來嘗試並找到一個記錄,我得到下面的輸出:

Enter name: Daniel Ghi 
{'Home Phone No.': 'Example', 'Mobile Phone No.': 'Example', 'Name': 'Daniel Ghi 
', 'Address': 'Example'} 
Traceback (most recent call last): 
    File "address.py", line 35, in <module> 
    search_for_person(name) 
    File "address.py", line 18, in search_for_person 
    if record['Name'] == name: 
KeyError: 'Name' 

正如你所看到的,這個實際上打印出正確的數據,但它仍然有一個KeyError,我不知道爲什麼。任何人都可以啓發我嗎?

+0

你可以在你創建你的字典的地方添加代碼嗎? – Tyler

+0

你已經證明沒有什麼證明''Name''總是'record'中的一個鍵。你唯一的'print'在*之後*出現,當我們知道它在那裏。在'record = get_record(data)'之後放置'print record'並看看它的樣子。 – DSM

+0

「記錄」中可能有第二條記錄沒有所需的密鑰。 – bouke

回答

4

它打印出正確的數據,然後繼續運行並在後面的數據上產生KeyError

最有可能您的文件以------字符串結尾,因此您的split會在最後生成一個帶空字符串的列表,然後生成一個空字典,該字典當然沒有任何鍵。

簡單修復就是跳過data,如果它爲空,或者只有空白或record爲空。更強大的修復方法是避免在使用[]語法時無法確定每個字典實際上具有哪些鍵;改爲使用record.get('Name', None)

+0

record.get('Name',None)有訣竅!乾杯。 :) – dantdj