2013-10-27 6 views
1

코드 : 기본적으로KeyError를 파일에 DICT를 작성하려고 [파이썬]

import re 


def add_details(details_dict, file_mode): 
    with open("address.txt", file_mode) as book: 
     book.write("Name: {}\n".format(details_dict['Name'])) 
     book.write("Address: {}\n".format(details_dict['Address'])) 
     book.write("Home Phone No.: {}\n".format(details_dict['Home Phone No.'])) 
     book.write("Mobile Phone No.: {}".format(details_dict['Mobile Phone No.'])) 
     book.write("\n---------------\n") 



def delete_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.get('Name', None) != name: 
       add_details(record, "w") 


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


def print_record(record): 
    print "\n" 
    print "Name: {}".format(record['Name']) 
    print "Address: {}".format(record['Address']) 
    print "Home Phone No.: {}".format(record['Home Phone No.']) 
    print "Mobile Phone No.: {}".format(record['Mobile Phone No.']) 


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.get('Name', None) == name: 
       print_record(record) 


choice = raw_input("Add a new person (1), delete a person(2), or search for a person(3)?\n") 
if choice == "1": 
    details = {'Name':"", 'Address':"", 'Home Phone No.':"", 'Mobile Phone No.':""} 
    details['Name'] = raw_input("Enter name of contact: ") 
    details['Address'] = raw_input("Enter address of contact: ") 
    details['Home Phone No.'] = raw_input("Enter Home Telephone No. of contact: ") 
    details['Mobile Phone No.'] = raw_input("Enter Mobile Telephone No. of contact: ") 

    add_details(details, "a") 

elif choice == "2": 
    name = raw_input("Enter name to delete: ") 
    delete_person(name) 

elif choice == "3": 
    name = raw_input("Enter name: ") 
    print search_for_person(name) 

, 나는 시도하고 delete_person() 메소드를 사용하여, 사람을 삭제할 때마다,이 역 추적 얻을 :

Traceback (most recent call last): 
    File "address.py", line 56, in <module> 
    delete_person(name) 
    File "address.py", line 19, in delete_person 
    add_details(record, "w") 
    File "address.py", line 6, in add_details 
    book.write("Name: {}\n".format(details_dict['Name'])) 
KeyError: 'Name' 

그러나 을 제외한 모든 것이 정상적으로 작동합니다. 나는 똑같은 방법으로 사전을 세운 것을 고려해 볼 때, 나는 오류를 범해서는 안된다. 그러나 나는 어쨌든이다. 이것에 대한 도움이 필요하십니까? 필요한 경우 파일의 레이아웃은 다음과 같습니다.

Name: test 
Address: testaddress 
Home Phone No.: 2313123121233 
Mobile Phone No.: 423423423432 
--------------- 
Name: test2 
Address: testaddress2 
Home Phone No.: 342353454345 
Mobile Phone No.: 231231391 
--------------- 
+0

'은'KeyError'를 발생 직전 선 어떤 모습 details_dict'입니까? – Blender

답변

2

언제나 -------을 추가합니다.

>>> record='''\ 
... Name: test 
... Address: testaddress 
... Home Phone No.: 2313123121233 
... Mobile Phone No.: 423423423432 
... --------------- 
... ''' 
>>> import re 
>>> re.split("[-]+", record, re.M) 
['Name: test\nAddress: testaddress\nHome Phone No.: 2313123121233\nMobile Phone No.: 423423423432\n', '\n'] 

주 말에 '\n' 항목 : 마지막으로 같은 줄 뒤에 공백하지만 아무것도 없기 때문에 이것은 기록되는 읽기로 연결됩니다. 즉 어떤 'Name' 키 빈 사전에 이르게 : 빈 사전에

>>> dict(re.findall("^(.*): (.*)$", '\n', re.M)) 
{} 

테스트 :

record = get_record(data) 
if record and record.get('Name', None) == name: 
+0

흠, 이해가 되네. 그럼 내가 어떻게 고칠 수 있겠 니? 필자는 파일을 사람이 읽을 수 있도록 분리 목적으로'---------'을 그대로두고 싶습니다. – dantdj

+0

@ dantdj : 답의 마지막 문장을보십시오. 'if record'로 테스트하여 빈 레코드를 건너 뛰십시오 (그리고 빈 컨테이너는 항상 부울 컨텍스트에서'False'입니다). –

+0

아, 아, 내 ... 피곤한 눈. 고마워, 친구! 모두 일하고있어. :) – dantdj