파이썬/프로젝트

명함관리프로그램

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