파이썬 pickle 을 이용해 전화번호부 구현하기 중 에러

조회수 1083회
  • 피클 모듈로 저장한 전화번호부 파일을 읽는다.
  • 사용자에게 이름을 입력 받는다.
  • 사용자가 ""를 입력하면, 프로그램을 종료한다.
  • 사용자가 전화번호부에 있으면, 전화번호를 출력한다.
  • 사용자가 전화번호부에 없다면, 사용자를 사전(dictionary)에 추가하고 파일로 저장한다.

[프로그램 설계]

다음 기능을 함수로 분리하세요.

  • def readPhonebook: # 전화번호부 읽기
  • def writePhonebook: # 전화번호부 파일에 쓰기
  • def searchPhonebook(name) # 전화번호부에서 이름을 검색한다.
  • def appendPhonebook(name) # 전화번호부에 이름을 추가한다.

[전화번호부] pickle 모듈


import pickle 

phoneDic = {
    "김갑순": "*** 개인정보보호를 위한 휴대폰번호 노출방지 ***",
    "누구나": "*** 개인정보보호를 위한 휴대폰번호 노출방지 ***",
    "김갑돌": "*** 개인정보보호를 위한 휴대폰번호 노출방지 ***",
    "아무개": "*** 개인정보보호를 위한 휴대폰번호 노출방지 ***"
}

print(phoneDic)

f = open("phonebook.p", 'wb')
pickle.dump(phoneDic, f)
f.close()

소스코드

def readPhonebook(): #피클 함수를 통해 저장한 전화번호 목록을 읽는다.
    import pickle
    f = open('phonebook.p', 'rb')
    phoneDic = pickle.load(f)
    f.close()
def writePhonebook(): # 전화번호부 파일에 쓰기
    import pickle
    global phoneDic
    phoneDic = { "김갑순": "*** 개인정보보호를 위한 휴대폰번호 노출방지 ***", "누구나": "*** 개인정보보호를 위한 휴대폰번호 노출방지 ***", "김갑돌": "*** 개인정보보호를 위한 휴대폰번호 노출방지 ***", "아무개": "*** 개인정보보호를 위한 휴대폰번호 노출방지 ***" }
    print(phoneDic)
    f = open('phonebook.p', 'wb')
    pickle.dump(phoneDic, f)
    f.close()
def appendPhonebook(who): #이름을 입력받아서 저장
    import pickle
    with open('phonebook.p','wb') as fw:
        pickle.dump(','+'{'+who+' : xxx-xxxx-xxxx'+'}', fw)
        print(phoneDic)
def searchPhonebook(): #이름을 전화번호 목록 중에서 찾는다.
    import pickle
    f = open("phonebook.p", 'rb')
    phoneList = str(f.readlines())
    f.close()
    print(phoneList)

    phoneDic={}
    for phone in phoneList:
        nn = phone.split(' ')   # 리스트를 만든다.
        phoneDic[nn[0]] = nn[1]     # 사전에 더해준다.

    for key, value in phoneDic.items():
        print(key, value)

    while True:
        who = input("enter name :")
        number = phoneDic.get(who)
        if (number == None):
            print(who + ' : 전화번호부에 없습니다.')
            appendPhonebook(who)
            break
        elif (who == '\"\"'):
            break
        else:
            print('phone number:' + number)
readPhonebook()
writePhonebook()
searchPhonebook()

이렇게 작성하였는데

Traceback (most recent call last):
  File "C:/Users/hjdyd/OneDrive/바탕 화면/data/1.py", line 47, in <module>
    searchPhonebook()
  File "C:/Users/hjdyd/OneDrive/바탕 화면/data/1.py", line 29, in searchPhonebook
    phoneDic[nn[0]] = nn[1]     # 사전에 더해준다.
IndexError: list index out of range

이런 오류가 발생하네요.

2 답변

  • 문제는 이곳에서 발생합니다.

    phoneDic={}
    for phone in phoneList:
        nn = phone.split(' ')   # 리스트를 만든다.
        phoneDic[nn[0]] = nn[1]     # 사전에 더해준다
    

    phoneList에 대해서는 올리지 않았기 때문에 무엇인지는 모르겠으나, 에러 메세지를 확인해보면 list index out of range, 리스트 범위를 벗어난 요청을 했다는 것을 보아 nn은 1개의 요소를 가진 리스트로 변환됐다는 것을 유추해볼 수 있습니다.

    nn을 출력해서 확인해보세요.

  • readPhonebook 을 그렇게 하는 게 아니에요.

    def readPhonebook(): #피클 함수를 통해 저장한 전화번호 목록을 읽는다.
        import pickle
        f = open('phonebook.p', 'rb')
        phoneDic = pickle.load(f)
        f.close()
        return phoneDic
    

    phoneDic 을 반환하는 함수로 만들어요. 그래서,

    phoneDic = readPhonebook()
    
    for key, value in phoneDic.items():
        print(key, value)
    

    이렇게 사용할 수 있어요. 이걸 searchPhonebook 안에서 사용하고, open 하고 파싱하는 코드들은 싹 날려야 해요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)