본문 바로가기
Python/파이썬 프로그래밍 연습

주소록 심화연구

by 가므자 2012. 4. 24.

주소록 심화연구

기본 디자인은 파일을 시작시에 읽어 들일 함수와 프로그램이 끝날 때 파일을 쓸 또다른 함수를 요구합니다. 사용자에게 선택 메뉴를 보여줄 함수도 만들겠습니다. 각 메뉴마다 따로 함수를 만들겠습니다. 메뉴는 사용자에게 다음 중에 하나를 허용합니다:

  • 주소록에 엔트리를 추가한다
  • 주소록에서 엔트리를 제거한다
  • 기존의 엔트리를 찾아 화면에 보여준다
  • 프로그램을 끝낸다

주소록 적재하기

filename = "addbook.dat"

def readBook(book):
import os
if os.path.exists(filename): #os.path.exists 파일 존재 체크
store = open(filename,'r')
for line in store:
name = line.rstrip()
entry = store.next().rstrip()
book[name] = entry #딕셔너리 구조
store.close()

새줄문자를 줄 끝에서 제거하기 위하여 rstrip()를 사용한 것을 주목하세요. 또 회돌이 안에서 파일로부터 다음 줄을 가져오는 next() 연산을 주목하세요. 마지막으로 파일이름을 모듈 수준의 변수로 정의하였음을 주목하세요. 그래서 데이터를 적재하고 저장하는데 모두 그 변수를 사용할 수 있습니다.

주소록 저장하기

def saveBook(book):
store = open(filename, 'w')
for name,entry in book.items():
store.write(name + '\n')
store.write(entry + '\n')
store.close()

데이터를 쓸 때 새줄문자('\n')를 추가할 필요가 있음을 주목하세요.

사용자 입력 얻기

def getChoice(menu):
print menu
choice = int( raw_input("Select a choice(1-4): ") )
return choice

엔트리 추가하기

def addEntry(book):
name = raw_input("Enter a name: ")
entry = raw_input("Enter street, town and phone number: ")
book[name] = entry

엔트리 제거하기

def removeEntry(book):
name = raw_input("Enter a name: ")
del(book[name])

엔트리 찾기

def findEntry(book):
name = raw_input("Enter a name: ")
if name in book:
print name, book[name]
else: print "Sorry, no entry for: ", name

프로그램 끝내기

실제로 이를 위해서 따로 함수를 작성하지 않겠습니다. 대신에 while 회돌이 메뉴에 테스트 삼아 quit 옵션을 만들어보겠습니다. 그래서 메인 프로그램은 다음과 같이 보일 것입니다:

def main():
theMenu = '''
1) Add Entry
2) Remove Entry
3) Find Entry
4) Quit and save
'''
theBook = {}#빈 딕셔너리 선언
readBook(theBook) #세부 파라미터 값지정
choice = getChoice(theMenu)
while choice != 4:
if choice == 1:
addEntry(theBook)
elif choice == 2:
removeEntry(theBook)
elif choice == 3:
findEntry(theBook)
else: print "Invalid choice, try again"
choice = getChoice(theMenu)
saveBook(theBook)

이제 남은 일은 프로그램이 실행되면 main() 함수를 호출하는 것입니다. 그렇게 하기 위해 다음과 같은 파이썬 방법을 이용합니다:

if __name__ == "__main__":
main()

이 난해한 코드 덕분에 파이썬 파일을 반입(import)하여 모듈처럼 이용하거나 또는 실행하여 프로그램처럼 이용할 수 있습니다. 프로그램이 반입될 때는 내부 변수 __name__에 모듈 이름이 설정되지만 파일이 실행될 때는 __name__의 값이 "__main__"으로 설정된다는 차이점이 있습니다. 교묘하지요. 그렇지요?

이제 모든 코드를 새로운 텍스트 파일 안에 타자하고 그것을 addressbook.py로 저장하면, OS 프롬프트에서 다음과 같이 타자하면 실행할 수 있을 것입니다:

C:\PROJECTS> python addressbook.py

출처 : http://coreapython.hosting.paran.com/tutor/index.htm

'Python > 파이썬 프로그래밍 연습' 카테고리의 다른 글

이름공간  (0) 2012.04.24
에러 처리하기  (0) 2012.04.24
텍스트 처리하기  (0) 2012.04.24
파일 처리하기  (0) 2012.04.24
미가공 재료  (0) 2012.04.24

댓글