31 — 기록: 작은 주소록
기록은 필드가 몇 개 든 딕셔너리 하나입니다. 주소록은 그 기록들의 목록을 JSON으로 저장한 것입니다. 이 가이드는 메뉴로 움직이는 주소록을 만듭니다 — 연락처 추가, 모두 보기, 이름 검색, 그리고 변경할 때마다 파일에 저장까지.
단계
연락처 하나는
name과phone을 담은 딕셔너리입니다. 책 전체는 그런 딕셔너리들의 목록입니다:
실행해 보기 →민아 = {"name": "Mina", "phone": "010-1234"} 연락처 = [민아] 말해 f"{연락처[0]['name']}: {연락처[0]['phone']}"실행하면
Mina: 010-1234가 출력됩니다.연락처[0]이 첫 딕셔너리고['name']이 그 필드를 꺼냅니다.실제 주소록은 저장된 파일을 불러오고, 파일이 아직 없으면 빈 목록으로 시작합니다. 15에서
os.path.exists를 같은 방식으로 썼습니다:
실행해 보기 →import os 파일 사용 최신 if os.path.exists("address.json"): 연락처 = json읽기("address.json") else: 연락처 = []json읽기는 저장된 그대로 딕셔너리 목록 전체를 돌려줍니다.add는append로 목록을 키우고 다시 씁니다.json저장은 딕셔너리 하나뿐 아니라 목록도 받습니다:
실행해 보기 →연락처.append({"name": 이름, "phone": 전화}) json저장("address.json", 연락처)list는for반복으로 목록을 훑으며 기록의 두 필드를 모두 출력합니다:
실행해 보기 →for contact in 연락처: 말해 f"{contact['name']}: {contact['phone']}"search는 같은 반복에서 거릅니다.찾기 in contact["name"]는 입력한 글자가 이름 어디에든 있으면 참이므로Min이Mina를 찾습니다:
실행해 보기 →for contact in 연락처: if 찾기 in contact["name"]: 말해 f"{contact['name']}: {contact['phone']}"메뉴 전체를 한 파일에 담습니다.
address.ko.nme로 저장합니다:
실행해 보기 →# address.ko.nme — 작은 주소록 (JSON 파일에 저장) # 실행: nme 실행 address.ko # add, list, search, quit 중 하나를 입력합니다. import os 파일 사용 최신 if os.path.exists("address.json"): 연락처 = json읽기("address.json") else: 연락처 = [] while True: 말해 "" 말해 "명령: add, list, search, quit" 물어봐 명령, "? " if 명령 == "add": 물어봐 이름, "이름? " 물어봐 전화, "전화? " 연락처.append({"name": 이름, "phone": 전화}) json저장("address.json", 연락처) 말해 f"{이름}: {전화} 저장" elif 명령 == "list": 말해 f"연락처 {len(연락처)}개" for contact in 연락처: 말해 f"{contact['name']}: {contact['phone']}" elif 명령 == "search": 물어봐 찾기, "검색어? " for contact in 연락처: if 찾기 in contact["name"]: 말해 f"{contact['name']}: {contact['phone']}" elif 명령 == "quit": 말해 "안녕!" break else: 말해 "알 수 없는 명령"파이프로 명령을 넣어 실행합니다:
printf 'add\nMina\n010-1234\nlist\nsearch\nMin\nquit\n' | nme 실행 address.ko명령: add, list, search, quit ? 이름? 전화? Mina: 010-1234 저장 명령: add, list, search, quit ? 연락처 1개 Mina: 010-1234 명령: add, list, search, quit ? 검색어? Mina: 010-1234 명령: add, list, search, quit ? 안녕!add가 새 연락처를address.json에 저장하고, 다음nme 실행 address.ko가 그 파일을 다시 불러오므로 주소록은 실행 사이에도 연락처를 지킵니다.while True:는 스스로 끝나지 않으므로quit이break로 나가야 합니다 — 22의 메뉴 모양입니다.영어는 같은 메뉴를
use file latest,ask,json_save로 씁니다. 전체 영어 프로그램은 영어 가이드에 있고, 이 조각은 저장된 주소록을 불러옵니다:
실행해 보기 →use file latest if os.path.exists("address.json"): contacts = json_load("address.json") else: contacts = []
직접 해보기
모든 연락처에 email 필드를 더해 보세요: add에서 물어보고, 딕셔너리에
저장하고, list에서 출력합니다. 저장된 JSON 모양이 바뀌지만 필드 없는
옛 파일도 그대로 불러와집니다 — 없는 필드는 그냥 아무것도 출력하지
않습니다.
배운 것
- 기록은 딕셔너리이고, 주소록은 그 딕셔너리들의 목록을 JSON으로 저장한 것입니다.
json저장은 딕셔너리 하나처럼 딕셔너리 목록도 씁니다.while True:에quit명령과break가 있으면 스스로 끝나지 않는 메뉴가 됩니다.찾기 in contact["name"]은 필드 안에서 글자를 검색합니다.os.path.exists는 첫 실행을 빈 목록으로 시작하게 해 줍니다.