Q. 파이썬에서 조건문을 사용하여 전화번호부를 만들어라
전화번호부 만들기 - 첫번째 결과물
코드를 이렇게 짜니(사실 몇 개의 기능은 작업 중에 추가되었다.) 기능이 완벽하게 작동했다.
phone_dict = {}
def display_menu():
print("-" * 20)
print("1. 연락처 추가")
print("2. 연락처 삭제")
print("3. 연락처 검색")
print("4. 연락처 수정")
print("5. 연락처 보기")
print("6. 연락처 초기화")
print("7. 종료")
menu = int(input("메뉴를 선택해 주세요: "))
return menu
def main():
try:
while True:
menu = display_menu()
if menu == 1: # 추가
get_contact()
elif menu == 2: # 삭제
del_contact()
elif menu == 3: # 검색
find_contact()
elif menu == 4: # 수정
edit_contact()
elif menu == 5: # 보기
see_contact()
elif menu == 6: # 초기화
reset_contact()
elif menu == 7: # 종료
break
else:
raise ValueError
except ValueError as err:
print("메뉴가 잘못 선택되었습니다.")
print(err)
# 이름 받기
def get_name():
name = name = input("이름을 입력해 주세요: (0:메뉴로)")
if name == "0":
print("메뉴 화면으로 돌아갑니다.")
return main()
else:
return name
# 연락처 추가
def get_contact():
name = get_name()
phone = input("전화번호를 입력해 주세요: ")
phone_dict[name] = phone
print(f"{name}님의 연락처가 추가되었습니다.")
# 연락처 삭제
def del_contact():
name = get_name()
if name in phone_dict:
del phone_dict[name]
print(f"{name}님의 연락처가 삭제되었습니다.")
else:
print("해당 이름이 없습니다.")
# 연락처 검색
def find_contact():
name = get_name()
if name in phone_dict:
print(f"{name}님의 연락처: {phone_dict[name]}")
else:
print("해당 이름이 없습니다.")
# 연락처 수정
def edit_contact():
name = get_name()
if name in phone_dict:
print(f"{name}님의 연락처: {phone_dict[name]}")
phone = input("수정할 연락처를 입력해 주세요: ")
phone_dict[name] = phone
print(f"{name}님의 연락처가 수정 되었습니다.")
else:
print("해당 이름이 없습니다.")
# 연락처 보기
def see_contact():
print("현재 저장된 연락처 목록")
for key, value in phone_dict.items():
print(f"{key}:{value}")
# 연락처 초기화
def reset_contact():
phone_dict.clear()
print("연락처가 모두 삭제되었습니다.")
# 프로그램 시작
if __name__ == "__main__":
main()
그러나 문제는, 코드를 종료하고나면 저장됐던 딕셔너리가 다 사라져 버렸다.
전화번호부 만들기 - 두번째 결과물
전화번호부 목록을 텍스트 파일에 저장하여 불러오기
처음에 만들었는데 코드를 실행을 종료할 때마다 딕셔너리가 초기화되는 것이 마음에 안 들어서 전화번호가 추가될 때마다 텍스트 파일에 저장하여 초기화되는 것을 방지하였다.
# 조건문을 사용하여 전화번호부 만들기
# 전화번호부 예: address_book = {"name": "xxx", "phone" :"000-0000-0000"}
phone_dict = {}
def display_menu():
print("-" * 20)
print("1. 연락처 추가")
print("2. 연락처 삭제")
print("3. 연락처 검색")
print("4. 연락처 출력")
print("5. 종료")
menu = int(input("메뉴 항목을 선택하세요: "))
return menu
def main():
# address_book = {}
try:
while True:
menu = display_menu()
if menu == 1:
get_contact()
elif menu == 2:
del_contact()
elif menu == 3:
find_contact()
elif menu == 4:
see_contact()
elif menu == 5:
break
else:
raise ValueError
except ValueError as err:
print("메뉴가 잘못입력되었습니다. 다시 입력해주세요")
print(f"에러 내용: {err}")
# 연락처 추가
def get_contact():
name = input("이름을 입력하세요: ")
if name == "취소":
main()
else:
phone = input("전화번호를 입력하세요: ")
phone_dict[name] = phone
print(f"{name}님의 전화번호가 입력되었습니다.")
save_file()
# 연락처 삭제
def del_contact():
input_name = input("이름을 입력하세요: ")
if input_name == "취소":
display_menu()
else:
if input_name in phone_dict:
del phone_dict[input_name]
print(f"{input_name}님의 연락처가 삭제되었습니다.")
save_file()
else:
print("해당 이름이 없습니다.")
# 연락처 검색
def find_contact():
input_name = input("이름을 입력하세요: ")
if input_name == "취소":
display_menu()
else:
if input_name in phone_dict:
print(f"{input_name}님의 연락처: {phone_dict[input_name]}")
else:
print("해당 이름이 없습니다.")
# 연락처 보기
def see_contact():
print("현재 저장된 연락처 목록:")
with open("phone_list.txt", "r", encoding="utf8") as file:
lines = file.readlines()
for line in lines:
print(line)
# 연락처 파일에 저장
def save_file():
with open("phone_list.txt", "a", encoding="utf8") as file:
for name, phone in phone_dict.items():
file.write(f"{name} : {phone}\n")
# 프로그램 시작
if __name__ == "__main__":
main()
전화번호부 만들기 - 세번째 결과물
pickle 모듈 사용
선생님께서 내가 해온 것을 보시더니 "연락처 수정" 할 수 있는 기능을 추가해 보라는 미션을 주셨다.
그래서 처음에 텍스트 파일을 이용하여 진행하였더니, 텍스트 파일을 불러올 때 딕셔너리 형태로 불러와야 하는 등의 번거로운 작업이 필요했다. 선생님께서 힌트를 주셨긴 하나, 도저히 이해가 되질 않아 다른 방법을 시도해 보기로 하였다.
그리하여 pickle을 사용한 방식으로 접근해봤다.
pickle은 파이썬에서 사용하는 딕셔너리, 리스트, 클래스 등의 자료형을 변환 없이 그대로 파일로 저장하고 이를 불러올 때 사용하는 모듈이다. (출처: 점프 투 파이썬)
import pickle as pkl
phone_dict = {}
def display_menu():
print("-" * 20)
print("1. 연락처 추가")
print("2. 연락처 삭제")
print("3. 연락처 검색")
print("4. 연락처 수정")
print("5. 연락처 보기")
print("6. 연락처 초기화")
print("7. 종료")
menu = int(input("메뉴를 선택해 주세요: "))
return menu
def main():
try:
while True:
menu = display_menu()
if menu == 1: # 추가
get_contact()
elif menu == 2: # 삭제
del_contact()
elif menu == 3: # 검색
find_contact()
elif menu == 4: # 수정
edit_contact()
elif menu == 5: # 보기
see_contact()
elif menu == 6: # 초기화
reset_contact()
elif menu == 7: # 종료
print("프로그램을 종료합니다.")
break
else:
raise ValueError
except ValueError as err:
print("메뉴가 잘못 선택되었습니다.")
print(err)
# 이름 받기
def get_name():
name = name = input("이름을 입력해 주세요: ")
if name == "취소":
print("메뉴 화면으로 돌아갑니다.")
return main()
else:
return name
# 연락처 추가
def get_contact():
name = get_name()
phone = input("전화번호를 입력해 주세요: ")
phone_dict[name] = phone
save_contact()
print(f"{name}님의 연락처가 추가되었습니다.")
# 연락처 삭제
def del_contact():
phone_dict = load_contact()
name = get_name()
if name in phone_dict:
del phone_dict[name]
save_contact()
print(f"{name}님의 연락처가 삭제되었습니다.")
else:
print("연락처에 저장된 이름이 아닙니다.")
# 연락처 검색
def find_contact():
phone_dict = load_contact()
name = get_name()
if name in phone_dict:
print(f"{name}님의 연락처: {phone_dict[name]}")
else:
print("연락처에 저장된 이름이 아닙니다.")
# 연락처 수정
def edit_contact():
phone_dict = load_contact()
name = get_name()
if name in phone_dict:
print(f"{name}의 전화번호: {phone_dict[name]}")
phone = input("수정할 연락처를 입력해 주세요: ")
phone_dict[name] = phone
save_contact()
print(f"{name}님의 연락처가 수정 되었습니다.")
print(f"{name}의 전화번호: {phone_dict[name]}")
else:
print("f{name}님은 연락처 목록에 없습니다.")
# 연락처 보기
def see_contact():
print("현재 저장된 연락처 목록")
phone_dict = load_contact()
for key, value in phone_dict.items():
print(f"{key}:{value}")
# 연락처 초기화
def reset_contact():
phone_dict = load_contact()
phone_dict.clear()
save_contact()
print("연락처가 모두 삭제되었습니다.")
# 연락처 딕셔너리로 저장
def save_contact():
with open("phone_list.p", "wb") as file:
pkl.dump(phone_dict, file)
# 연락처 불러오기
def load_contact():
try:
with open("phone_list.p", "rb") as file:
phone_dict = pkl.load(file)
return phone_dict
except (FileNotFoundError, EOFError): # 예외처리: 파일이 없거나 비어있을 때
phone_dict = {}
# 프로그램 시작
if __name__ == "__main__":
main()
▶ 7가지의 기능 중 대부분이 제대로 작동하긴 하나, 연락처 삭제와 연락처 수정 부분이 제대로 동작하질 않는다.
생각해보면 이것은 앞으로 배울 데이터베이스의 CRUD 와 매우 연관이 있는 작업일텐데, 추후에 해당 부분을 배우면 좀 더 원활하게 해결해 나가지 않을까 싶다.
그래도 한 가지 변한 것이 있다면, 예전처럼 독학할 때 였다면 막히면 바로 챗GPT에 돌려서 코드 복사 붙여넣기 해서 해결하고 그랬을텐데, 지금은 거의 안 찾아보고 최대한 내 머릿속에서 끄집어 내려고 하고 있다. (구글링은 가끔하긴 하나, 자제하고 있다.)
추후에 데이터베이스를 배워서 기술이 더 쌓이고, 이 과제를 잊지 않는다면 해당 과제를 좀 더 디벨롭 시켜볼 계획이다.
★ 수정 내용
아래의 사용자 정의 함수 get_name() 에서 "취소"라고 입력할 경우, 메뉴 화면으로 돌아가게 display_menu 를 반환하라고 설정했는데, 이렇게 되면 메뉴 화면으로 넘어가기는 하나, 메뉴 선택 시 코드가 제 기능을 못하고 종료된다.
def get_name():
name = name = input("이름을 입력해 주세요: ")
if name == "취소":
print("메뉴 화면으로 돌아갑니다.")
return display_menu()
else:
return name
따라서 return display_menu()를 return main()으로 변경하면 메인 화면으로 돌아가서 제대로 실행이 잘 된다.
'[파이썬 Projects] > <파이썬 기초>' 카테고리의 다른 글
[파이썬] 파이썬 기초 - 딕셔너리 보완 (0) | 2025.01.21 |
---|---|
[파이썬] 파이썬 기초 - 집합 (set) 보완 (0) | 2025.01.20 |
[파이썬] 파이썬 기초: 파일 읽고 쓰기 (보완) (0) | 2025.01.16 |
[파이썬] 파이썬 기초: 다양한 출력 포맷 (0) | 2025.01.15 |
[파이썬] 파이썬 기초 - 랜덤 모듈 (0) | 2025.01.15 |