2013-10-23 93 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