파이썬/프로젝트
명함관리프로그램
watervin
2022. 1. 10. 17:44
namecard_app.py
# 명함 관리 프로그램 # 관리할 명함 정보: 이름, 전화번호, email, 주소 ==> 연락처(주소록) 관리 # 시작할때 고려사항 # 1. 데이터를 어떻게 표현하고 관리할것인가? # 한 사람의 정보 --> 사전 # 여러명의 정보 --> 리스트 # 2. 어떤 기능을 제공할 것인가? # 목록(검색), 추가, 수정, 삭제 # CRUD 연산(Create, Read, Update, Delete) # 즐겨찾기, 그룹핑, 파일저장, 파일 로딩, .... 종료 import sys import random from file_util import load_json, save_json books = [] FILE_NAME = 'books.json' def create_card(name, phone, email, address): return { "name": name, "phone": phone, "email": email, "address": address } def init(): # 초기화 함수 # for i in range(1, 101): # card = create_card(f'홍길동{i:03}', f'010-1111-{i:04}', f'hong{i:03}@google.com', '서울시') # books.append(card) # random.shuffle(books) # # 이름으로 정렬하세요. # books.sort(key= lambda card : card["name"]) # 람다함수로 key에 지정 global books books = load_json(FILE_NAME) def print_menu(): print() print('='*40) print('목록 검색 추가 수정 삭제 종료') print('='*40) def print_card_list(card_list): # 0] 홍길동001 010-1111-0001 인덱스 이름 전화번호 print('-'*40) for ix, card in enumerate(card_list) : print(f'{ix:3} {card["name"]} {card["phone"]}') print('-'*40) print(f'총: {len(card_list)}명') print() # 목록 메뉴 실행 함수 def print_list(): print("목록보기") # 리스트의 인덱스를 같이 출력되게 합니다. print_card_list(books) # 검색 메뉴 실행 함수 def search(): print("검색하기") keyword = input("검색 이름: ") # 검색하고, 출력 # result = [] # for card in books: # if keyword in card["name"]: # result.append(card) # 람다함수를 이용한 filter result = list(filter(lambda card: keyword in card["name"] , books)) print_card_list(result) # result 리스트 출력 # print('-'*40) # for ix, card in enumerate(result) : # print(f'{ix:3} {card["name"]} {card["phone"]}') # print('-'*40) # print(f'총: {len(result)}명') # print() # 종료 메뉴 실행 함수 def exit(): answer = input("종료할까요?(y/n) ") # Y, y 입력하면 종료 if answer in ['Y', 'y']: # answer.lower() == 'y', answer == 'Y' or answer=='y' # book.json 파일로 저장하세요. save_json(FILE_NAME, books) sys.exit(0) # 추가 메뉴 실행 함수 def add_card(): name = input('이름: ') phone = input('전화번호: ') email = input('email: ') address = input('주소: ') card = create_card(name, phone, email, address) books.append(card) books.sort(key= lambda card : card["name"]) def find_by_name(name): # 찾았으면 인덱스 리턴 # 없으면 -1 리턴 for ix, card in enumerate(books): if card['name'] == name: return ix return -1 # for문을 다 돌았다는 의미 --- 데이터가 없다. def delete_card(): name = input("삭제할 이름: ") ix = find_by_name(name) if ix != -1: books.pop(ix) # del books[ix] print(f'{name} 항목을 삭제했습니다.') else: print(f'{name} 항목이 없습니다.') def update_card(): # 이름입력 받기 # 인덱스 찾기 # 있으면 ... 업데이트 # 기존 데이터 보여줌 이름(홍길동001): # 변경이 없으면 그냥 엔터 # 변경할거면 입력해서 수정처리 # 없으면 ... 없음 출력 name = input("수정할 이름: ") ix = find_by_name(name) if ix != -1: card = books[ix] name = input(f'이름({card["name"]}): ') if name != '': # 입력 없이 엔터 친 경우 '' card['name'] = name phone = input(f'전화번호({card["phone"]}): ') if phone != '': # 입력 없이 엔터 친 경우 '' card['phone'] = phone email = input(f'email({card["email"]}): ') if email != '': # 입력 없이 엔터 친 경우 '' card['email'] = email address = input(f'주소({card["address"]}): ') if address != '': # 입력 없이 엔터 친 경우 '' card['address'] = address print(f'{name} 항목을 수정했습니다.') else: print(f'{name} 항목이 없습니다.') def main(): init() while True: # 메뉴 출력 print_menu() # 사용자가 메뉴를 입력 menu_item = input('선택> ') # 입력한 메뉴를 실행/결과 출력 if menu_item == '목록': print_list() elif menu_item == '검색': search() elif menu_item == '추가': add_card() elif menu_item == '수정': update_card() elif menu_item == '삭제': delete_card() elif menu_item == '종료': exit() else: # 잘못 입력한 경우 print('잘못 입력한 메뉴입니다.') main() |
file_util.py
import pickle import json def save(file_name, data): try: with open(file_name, "wb") as file: pickle.dump(data, file) except Exception as e: print(e) def save_json(file_name, data): try: with open(file_name, "wt") as file: json.dump(data, file) except Exception as e: print(e) def load(file_name): try: with open(file_name, "rb") as file: data = pickle.load(file) return data except Exception as e: print(e) def load_json(file_name): try: with open(file_name, "rt") as file: data = json.load(file) return data except Exception as e: print(e) |
time_util.py
import time from datetime import datetime def get_time_filename(ext, seq=1): now = datetime.now() file_name = f'{now.year}{now.month:02}{now.day:02}-{now.hour:02}{now.minute:02}{now.second:02}{seq:03}.{ext}' return file_name def get_elapse_time(func): # 함수를 매개변수로 전달 받음 start = time.time() func() # 매개변수로 전달받은 함수를 실행 end = time.time() return end - start |