사례 연구
이번 사례 연구를 위하여 앞서 개발한 단어 세기 프로그램을 확장해 보겠습니다. 유닉스의 wc 프로그램을 흉내내는 프로그램을 만들겠습니다. 이 프로그램은 파일에 있는 줄과 단어 그리고 문자의 개수를 출력합니다. 그렇지만 그 보다 더 나아가 문장과 절 그리고 문단의 개수를 출력하겠습니다. 이 프로그램의 개발을 단계별로 따라가겠습니다. 서서히 능력을 키워서 그것을 재사용 가능하도록 모듈로 이동시키고 최대한 확장성을 확보하기 위해 그 모듈을 OO 구현으로 변환하겠습니다. 그리고 마지막으로 그것을 사용하기 쉽게 GUI 안으로 싸 넣겠습니다.
쭈욱 파이썬을 사용할 생각이지만 약간만 수정하면 JavaScript나 VBScript로 프로그램을 구축할 수도 있습니다.
구현할 수는 있지만 독자를 위해 남겨둘 특징은 다음과 같습니다.
· 텍스트의 FOG 인덱스를 계산한다. 여기에서 FOG 인덱스는 (대략) 다음과 같이 정의할 수 있다:
· (문장당 평균 단어수) + (5 문자를 넘는 단어의 비율) * 0.4
그리고 텍스트의 복잡도를 표시한다.
· 유일한 단어의 개수와 그 출현빈도를 계산한다.
· RTF 파일을 분석하는 버전을 새로 만든다.
줄과 단어 그리고 문자 세기
앞의 단어 세기 코드를 다시 살펴봅시다:
import string
def numwords(s): # split()은 문자열 객체 aString의 메쏘드이다.
list = string.split(s)
return len(list) # 리스트의 원소 개수를 돌려준다.
inp = open("menu.txt","r")
total = 0 # 0으로 초기화; 또 변수가 생성된다.
# 각 줄에 대하여 총계를 누적한다.
for line in inp.readlines():
total = total + numwords(line) # 각 줄에 대하여 총계 누적한다.
print "File had %d words" % total
inp.close()
문자 계수기와 줄 계수기를 추가할 필요가 있습니다. 줄 계수기는 쉽습니다. 왜냐하면 한 줄을 회돌이할 때마다 그냥 변수를 하나씩 증가시키면 되기 때문입니다. 문자 계수기는 약간만 더 어려울 뿐입니다. 단어 리스트를 회돌이하면서 자신의 길이를 또다른 변수에 더하면 됩니다.
또 명령 줄로부터 파일의 이름을 읽음으로써 또는 주어지지 않으면 사용자에게 이름을 요구함으로써 프로그램을 더 범용적으로 만들 필요가 있습니다. (대안 전략은 표준 입력으로부터 읽는 것입니다. 이것이 바로 진짜 wc가 하는 일입니다.)
그래서 최종적인 wc는 다음과 같습니다:
import sys, string
# 명령 줄이나 사용자로부터 파일 이름을 얻는다
if len(sys.argv) != 2:
name = raw_input("파일 이름을 입력하시오: ")
else:
name = sys.argv[1]
inp = open(name,"r")
# 계수기를 0으로 초기화한다; 변수도 생성된다
words, lines, chars = 0, 0, 0
for line in inp:
lines += 1
# 단어 리스트로 들어가 개수를 세어본다
list = line.split()
words += len(list)
chars += len(line) # 공간문자 등등이 들어 있는 원래 줄을 사용한다.
print "%s에는 %d 줄과 %d 단어 그리고 %d 문자가 있습니다." % (name, lines, words, chars)
inp.close()
유닉스의 wc 명령에 친숙하시다면 거기에 와일드-카드 파일이름을 건네서 부합하는 모든 파일에 대한 통계뿐만 아니라 총계도 얻을 수 있다는 사실을 알고 계실 겁니다. 이 프로그램은 오로지 직접적인 파일이름만 충족합니다. 와일드카드를 충족시키도록 확장하고 싶다면 glob 모듈을 살펴보시고 이름 리스트를 구축한 다음에 그냥 그 파일 리스트를 반복하시면 됩니다. 각 파일에 대하여 임시 계수기가 필요하고 총계에 대하여 축척 계수기가 필요할 것입니다. 그렇지 않으면 대신에 사전을 사용할 수도 있습니다.
출처: http://coreapython.hosting.paran.com/tutor/index.htm
'Python > 파이썬 프로그래밍 연습' 카테고리의 다른 글
데이터베이스 작업 (0) | 2012.04.25 |
---|---|
실전에 사용되는 파이썬 (0) | 2012.04.25 |
기능적 프로그래밍 (0) | 2012.04.25 |
재귀 - 자기 자신에게 되돌리는 것 (0) | 2012.04.25 |
wxPython 으로 GUI 프로그램 만들기 - 컴파일, py2exe (0) | 2012.04.25 |
댓글