[2] 외장함수
유용한 파이썬 라이브러리들
파이썬 사용에 날개를 달아보자. 전세계의 파이썬 사용자들에 의해서 이미 만들어진 프로그램들을 모아놓은 것이 바로 파이썬 라이브러리이다. ‘라이브러리’는 ‘도서관’이다. 즉, 찾아보는 곳이다. 모든 라이브러리를 공부할 필요는 없다.
그저 어떤 곳에 어떤 라이브러리를 써야 한다는 것만 알면 된다.
그러기 위해서 어떤 라이브러리들이 존재하고 어떻게 사용하는지에 대해서 알아야 할 필요가 있다.
이 곳에서 파이썬의 모든 라이브러리를 다루지는 않을 것이다. 다만, 자주 쓰이고 꼭 알아야만 한다고 여겨지는 것들에 대해서만 다루도록 하겠다.
그리고 여기서는 주로 실례 위주로 설명할 것이다.
자세한 것은 파이썬과 함께 배포되는 파이썬 라이브러리 레퍼런스를 참고하도록 하자. (※ 파이썬 라이브러리는 파이썬 설치시 자동으로 컴퓨터에 설치가 된다.)
명령행에서 인수를 전달(sys.argv)
sys 모듈은 파이썬 인터프리터가 제공하는 변수들과 함수들을 직접 접근하여 제어할 수 있게 해주는 모듈이다.
sys.argv
C:\Python21> python test.py abc pey guido
위의 예에서와 같이 python test.py뒤에 또 다른 값들을 함께 넣어주면 sys.argv라는 리스트에 그 값들이 추가되게 된다.
예제따라해 보기)
1. 우선 다음과 같은 파이썬 프로그램을 작성하자. (C:\Python\Mymoduels 라는 디렉토리에 저장했다고 가정을 한다.)
# argv_test.py
import sys
print sys.argv
2. 도스창에서 다음과 같이 해보자.
C:\Python\Mymodules> python argv_test.py you need python
['argv_test.py', 'you', 'need', 'python']
위처럼 python이란 명령어 뒤의 모든 것들이 공백을 기준으로 나뉘어서 sys.argv 리스트의 요소가 됨을 알 수 있다. 2장 입출력 부분의 명령행 입출력에서 자세한 내용을 다루고 있다.
강제 스크립트 종료법(sys.exit)
>>> sys.exit()
sys.exit는 Ctrl-Z나 Crtl-D를 눌러서 대화형 인터프리터를 종료하는 것과 같은 기능을 한다. 또, 프로그램 파일 내에서 쓰이면 프로그램을 중단하게 된다.
자신이 만든 모듈 불러서 쓰기(sys.path)
sys.path는 파이썬 모듈들이 저장되어 있는 위치를 나타낸다. 즉, 이 위치에 있는 xxx.py 파일들은 경로에 상관없이 어디에서나 불러올 수가 있다.
다음은 그 실행 결과이다.
>>> import sys
>>> sys.path
['', 'c:\python21', 'c:\python21\dlls', 'c:\python21\lib', 'c:\python21\l
ib\plat-win', 'c:\python21\lib\lib-tk']
>>>
위의 예에서 ''는 현재 디렉토리를 말한다.
# path_append.py
import sys
sys.path.append("C:\Python\Mymodules")
위와 같이 파이썬 프로그램 파일에서 sys.path.append를 이용해 경로명을 추가시킬 수 있다. 이렇게 하고 난 뒤에는 C:\Python\Mymodules라는 디렉토리에 있는 xxx.py 파일을 불러서 쓸 수가 있다.
객체를 그 상태 그대로 파일에 저장하고 싶을 때(pickle)
pickle 모듈은 객체의 형태를 그대로 유지하게 하여 파일에 저장시키고 또 불러올 수 있게 하는 모듈이다.
아래의 예는 파일을 쓰기 모드로 열어서 딕셔너리 객체인 data를 그대로 pickle.dump로 저장하는 전형적인 방법이다.
>>> import pickle
>>> f = open("test.txt", 'w')
>>> data = {1: 'python', 2: 'you need'}
>>> pickle.dump(data, f)
>>> f.close()
pickle.dump에 의해 저장된 파일을 열어 원래 있던 딕셔너리 객체(data)를 그대로 가져오는 전형적인 예이다.
>>> import pickle
>>> f = open("test.txt", 'r')
>>> data = pickle.load(f)
>>> print data
{2:'you need', 1:'python'}
위의 예에서는 딕셔너리 객체를 이용하였지만 어떤 자료형이든지 상관없다.
문자열 처리(string)
string 모듈은 문자열 처리에 쓰인다. 이 책 2장 파이썬 자료형 중 문자열에 관한 내용에서 이미 문자열 관련 함수를 알아보았다. 이 string 모듈의 관련함수들은 문자열 자체의 관련 함수들과 거의 일치하며 똑같이 동작한다. 여기서는 string 모듈에만 있는 함수 몇 개만 알아보기로 하자.
>>> import string
>>> dir(string)
['_StringType', '__builtins__', '__doc__', '__file__', '__name__', '_float', '_idmap', '_idmapL', '_int',
'_long', 'atof', 'atof_error', 'atoi', 'atoi_error', 'atol', 'atol_error', 'capitalize', 'capwords',
'center', 'count', 'digits', 'expandtabs', 'find', 'hexdigits', 'index', 'index_error', 'join', 'joinfields',
'letters', 'ljust', 'lower', 'lowercase', 'lstrip', 'maketrans', 'octdigits', 'printable', 'punctuation',
'replace', 'rfind', 'rindex', 'rjust', 'rstrip', 'split', 'splitfields', 'strip', 'swapcase', 'translate',
'upper', 'uppercase', 'whitespace', 'zfill']
위에서 보듯이 dir(string)을 한 결과 우리가 이미 알아본 문자열 관련 함수들과 거의 일치함을 확인할 수 있다. 즉, 다음은 완전히 동일하다.
>>> import string
>>> string.split("you need python")
['you', 'need', 'python']
>>> "you need python".split()
['you', 'need', 'python']
위의 예는 string 모듈의 split 함수를 이용한 것이고 밑의 예는 문자열 자체의 split함수를 이용한 것이다. string 모듈에만 있는 함수에는 다음과 같은 것들이 있다.
atof
문자열 형태의 숫자를 실수로 바꾸어 준다.
>>> string.atof('3')
3.0
atof는 실수로 변환 가능한 문자를 실수 형태로 바꾸어 주는 함수이다. 이것은 다음과 같은 의미이다.
>>> float('3')
3
atoi
위의 atof와 마찬가지로 정수로 변환 가능한 문자를 정수 형태로 바꾸어주는 함수이다. int 함수와 동일한 결과값을 출력한다.
>>> string.atoi('3')
3
>>> int('3')
3
zfill
이것은 주로 숫자를 표시하는 데 쓰이는 함수로 앞의 빈 공간을 0으로 채워 준다. zfill 은 zero + fill 즉 0으로 채운다는 의미이다.
>>> string.zfill(3, 8)
'00000003'
>>> string.zfill('a', 3)
'00a'
string.zfill(a, b)에서 첫 번째 인수(a)는 표시할 값이고 두 번째 인수(b)는 총 길이를 나타낸다. 우리는 보통 날짜를 저장할 때 2001-04-04 식으로 04월 04일처럼 앞에 0을 써주는 게 종종 필요하다. 이 때 zfill을 사용하면 매우 유용할 것이다.
파일 흉내내기(StringIO)
StringIO는 파일처럼 취급되는 객체를 만들어낸다. 단 실제 파일객체는 아니고 흉내를 낼 뿐이다.
[사용예제]
우선 StringIO 모듈을 사용하기 위해서 불러온다(import).
>>> import StringIO
그리고 StringIO의 함수인 StringIO를 이용해서 StringIO의 객체를 하나 생성한다. 이 객체 마치 파일 객체처럼 행동한다. 따라서 파일 객체에 쓰이는 함수들이 그대로 적용된다.
>>> f = StringIO.StringIO()
그리고 그 객체에 write를 이용하여 "life is too short"라는 문장을 써넣었다.
>>> f.write("life is too short")
그리고 나서 그 객체에 쓰여진 문자열을 getvalue를 이용하여 읽어서 변수 value에 대입하였다. 이 getvalue는 StringIO에서만 쓰이는 함수이다.
>>> value = f.getvalue()
>>> value
'life is too short'
그리고 최종적으로 close를 이용해서 파일 객체를 메모리에서 없애버린다.
>>> f.close()
[참고] StringIO가 자주 쓰이는 이유
우리는 프로그래밍을 할 때 가끔 문자열 데이터를 파일에 저장한 다음에 여러 가지 처리를 한다. 하지만 그 파일이 다시 쓰이지 않고 꼭 저장될 필요가 없다면 굳이 파일에 저장할 필요는 없을 것이다.
이렇게 꼭 파일을 만들어서 처리를 할 필요가 없게 해주는 모듈이 바로 StringIO다. 물론 항상 이러한 용도로만 쓰이는 것은 아니지만 대부분 파일 처리를 하는 곳에서 이 StringIO는 매우 유용하다.
현재 내 시스템 환경변수값을 알고싶을 때는? (os.environ)
시스템은 제각기 다른 환경 변수 값들을 가지고 있는데 파이썬에는 이러한 환경 변수값 들을 보여주는 os모듈의 environ이다. 다음을 따라해 보자.
>>> import os
>>> os.environ
{'CMDLINE': 'WIN', 'PATH': 'C:\WINDOWS;C:\WINDOWS\COMMAND;C:\PROGRA~1\ULTRA
EDT;C:\JDK1.3\BIN;C:\ESSOLO.COM;C:\VIM\VIM\VIM57;C:\PYTHON21', 'BLASTER':
'A240 I10 D1', 'TEMP': 'C:\WINDOWS\TEMP', 'COMSPEC': 'C:\WINDOWS\COMMAND.CO
M', 'PROMPT': '$p$g', 'WINBOOTDIR': 'C:\WINDOWS', 'WINDIR': 'C:\WINDOWS', 'TMP
': 'C:\WINDOWS\TEMP'}
>>>
위의 결과값은 필자의 시스템 정보이다. os.environ은 딕셔너리 객체를 돌려준다. 자세히 보면 여러 가지 유용한 정보를 찾을 수 있다.
딕셔너리이기 때문에 다음과 같이 호출할 수 있다. 필자의 시스템의 PATH변수이다. 이것은 윈도우즈 C:\WINDOWS\autoexec.bat에서 설정해 놓은 정보이다.
>>> os.environ['PATH']
'C:\WINDOWS;C:\WINDOWS\COMMAND;C:\PROGRA~1\ULTRAEDT;C:\JDK1.3\BIN;C:\ESS
OLO.COM;C:\VIM\VIM\VIM57;C:\PYTHON21'
>>>
디렉토리에 대한 것들(os.chdir, os.getcwd)
아래와 같이 현재 디렉토리의 위치를 변경할 수 있다.
>>> os.chdir("C:\WINDOWS")
os.getcwd()
현재 자신의 디렉토리 위치를 돌려준다.
>>> os.getcwd()
'C:\WINDOWS'
시스템 명령(os.system, os.popen)
os.system
시스템의 유틸리티나 기타 명령어들을 파이썬에서 호출할 수 있다. os.system(“명령어”)처럼 사용해야 한다. 다음은 현재 디렉토리에서 dir을 실행하는 예이다.
>>> os.system("dir")
dir의 결과값 출력
os.popen
os.popen은 시스템 명령어를 실행시킨 결과값을 읽기 모드 형태의 파일객체로 돌려준다.
>>> files = os.popen("dir")
>>> files
>>>
읽은 파일 객체의 내용을 보기 위해서는 다음과 같이 하면 될 것이다.
>>> print files.read()
기타 유용한 os 관련 함수
함수 |
설명 |
os.mkdir(디렉토리) |
디렉토리를 생성한다. |
os.rmdir(디렉토리) |
디렉토리를 삭제한다.단, 디렉토리가 비어있어야 삭제가 가능하다. |
os.unlink(파일) |
파일을 지운다. |
os.rename(src, dst) |
src라는 이름의 파일을 dst라는 이름으로 바꾼다. |
파일 복사(shutil)
shutil은 파일을 복사해 주는 파이썬 모듈이다.
shutil.copy(src, dst)
src라는 이름의 파일을 dst로 복사한다. 만약 dst가 디렉토리 이름이라면 src라는 파일이름으로 dst이라는 디렉토리에 복사하고 그 이름이 존재하면 덮어쓰게 된다.
>>> import shutil
>>> shutil.copy("src", "dst")
디렉토리에 있는 파일들을 리스트로 만들려면 (glob)
가끔 파일을 읽고 쓰는 기능이 있는 프로그램들을 만들다 보면 해당 디렉토리의 파일들의 이름을 알아야 할 때가 있는데 이럴 때 쓰이는 모듈이 바로 glob이다.
glob(pathname)
glob모듈은 해당 디렉토리내의 파일들을 읽어서 리스트로 돌려준다. *, ?등의 메타문자를 써서 원하는 파일만을 읽어들일 수도 있다.
다음은 C:\Python이란 디렉토리에 있는 파일중 이름이 Q문자로 시작하는 파일들을 모두 찾아서 리스트로 돌려준 예이다.
>>> import glob
>>> glob.glob("C:\Python\Q*")
['C:\Python\quiz.py', 'C:\Python\quiz.py.bak']
>>>
임시파일 (tempfile)
임시적으로 파일을 만들어서 쓸 때 유용하게 쓰이는 모듈이 바로 tempfile이다. tempfile.mktemp()는 중복되지 않는 임시파일의 이름을 만들어서 돌려준다.
>>> import tempfile
>>> filename = tempfile.mktemp()
>>> filename
'C:\WINDOWS\TEMP\~-275151-0'
tempfile.TemporaryFile()은 임시적인 저장공간으로 사용될 파일 객체를 돌려준다. 기본적으로 w+b 의 모드를 갖는다. 이 파일객체는 f.close()가 호출될 때 자동으로 사라지게 된다.
>>> import tempfile
>>> f = tempfile.TemporaryFile()
시간에 관한 것들(time)
time 모듈에 관련된 유용한 함수는 굉장히 많다. 그 중에서 가장 유용한 몇 가지만 알아보도록 하자.
time.time
time.time()은 UTC(Universal Time Coordinated 협정 세계 표준시)를 이용하여 현재의 시간을 실수형태로 반환하여 주는 함수이다. 1970년 1월 1일 0시 0분 0초를 기준으로 지난 시간을 초단위로 돌려준다.
>>> import time
>>> time.time()
988458015.73417199
time.localtime
time.localtime은 time.time()에 의해서 반환된 실수값을 이용해서 년도, 달, 월, 시, 분, 초,.. 의 터플 형태로 바꾸어 주는 함수이다.
>>> time.localtime(time.time())
(2001, 4, 28, 20, 48, 12, 5, 118, 0)
time.asctime
위의 time.localtime에 의해서 반환된 터플 형태의 값을 인수로 받아서 알아보기 쉬운 날짜와 시간 형태의 값을 반환하여 주는 함수이다. 가장 자주 사용되는 시간관련 함수이다.
>>> time.asctime(time.localtime(time.time()))
'Sat Apr 28 20:50:20 2001'
time.ctime
위의 time.asctime은 간단하게 다음처럼 표현된다.
>>> time.ctime()
'Sat Apr 28 20:56:31 2001'
time.strftime
time.strftime('출력할 형식포맷코드', time.localtime(time.time())) strftime 함수는 시간에 관계된 것을 세밀하게 표현할 수 있는 여러 가지 포맷코드를 제공해 준다.
포맷코드 |
설명 |
예 |
%a |
요일 줄임말 |
Mon |
%A |
요일 |
Monday |
%b |
달 줄임말 |
Jan |
%B |
달 |
January |
%c |
날짜와 시간을 출력함(로케일 설정에 의한 형식에 맞추어) |
06/01/01 17:22:21 |
%d |
날(day) |
[00,31] |
%H |
시간(hour)-24시간 출력 형태 |
[00,23] |
%I |
시간(hour)-12시간 출력 형태 |
[01,12] |
%j |
1년 중 누적 날짜 |
[001,366] |
%m |
달 |
[01,12] |
%M |
분 |
[01,59] |
%p |
AM or PM |
AM |
%S |
초 |
[00,61] |
%U |
1년 중 누적 주-일요일을 시작으로 |
[00,53] |
%w |
숫자로 된 요일 |
[0(일요일),6] |
%W |
1년 중 누적 주-월요일을 시작으로 |
[00,53] |
%x |
현재 설정된 로케일에 기반한 날짜 출력 |
06/01/01 |
%X |
현재 설정된 로케일에 기반한 시간 출력 |
17:22:21 |
%Y |
년도 출력 |
2001 |
%Z |
시간대 출력 |
대한민국 표준시 |
%% |
문자 % |
|
%y |
세기부분을 제외한 년도 출력 |
01 |
>>> import time
>>> time.strftime('%x', time.localtime(time.time()))
'05/01/01'
>>> time.strftime('%c', time.localtime(time.time()))
'05/01/01 17:22:21'
time.sleep
time.sleep 함수는 보통 루프 안에서 많이 쓰이는데 일정한 시간 간격을 주기 위해서 주로 쓰이게 된다. 다음 예제를 보자.
#sleep1.py
import time
for i in range(10):
print i
time.sleep(1)
위 예제는 1초 간격으로 0부터 9까지의 숫자를 출력하게 된다. time.sleep 함수의 인수로는 실수 형태가 가능하다. 즉 1이면 1초이고 0.5 이면 0.5초가 되는 것이다.
파이썬에서 달력쓰기(calendar)
파이썬에서 달력을 볼 수 있게 해 주는 모듈이다.
2001년의 전체 달력을 볼 수가 있다.
>>> import calendar
>>> print calendar.calendar(2001)
위와 똑같은 결과값을 보여준다.
>>> calendar.prcal(2001)
2001년 4월의 달력만을 보여준다. 하지만 위의 것들은 프로그래밍 내에서는 거의 쓰이질 않는다. 다만 대화형 인터프리터에서 오늘 날짜를 확인하는 정도의 용도로만 쓰인다.
>>> calendar.prmonth(2001, 4)
April 2001
Mo Tu We Th Fr Sa Su
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
다음의 유용한 calendar 모듈의 함수를 보도록 하자. weekday(년도, 월, 일) 함수는 그 날짜에 해당하는 요일 정보를 돌려준다. 월요일은 0, 화요일은 1, 수요일은 2, 목요일은 3, 금요일은 4, 토요일은 5, 일요일은 6이라는 값을 돌려준다.
>>> calendar.weekday(2001, 4, 28)
5
위의 예에서 2001년 4월 28일은 토요일이 될 것이다. monthrange(년도, 월) 함수는 입력받은 달의 1일이 무슨 요일인지와 그 달이 몇 일까지 있는지에 대한 정보를 터플 형태로 돌려준다.
>>> calendar.monthrange(2001,4)
(6, 30)
위의 예는 2001년 4월의 1일은 일요일이고 30일까지 있다는 것을 보여준다. 주로 날짜 관련된 프로그래밍을 할 때 위의 두 가지 함수는 매우 유용하게 사용된다.
난수 발생시키기 (random)
random은 난수발생 모듈이다. random과 randint에 대해서 알아보자.
다음은 0.0에서 1.0 사이의 실수값 중에서 난수값을 돌려주는 예를 보여준다.
>>> import random
>>> random.random()
0.53840103305098674
1에서 10사이의 정수사이에서 난수값을 돌려준다.
>>> random.randint(1,10)
6
1에서 55 사이의 정수 사이의 난수 값을 돌려준다.
>>> random.randint(1,55)
43
이러한 난수를 이용해서 재미있는 함수를 하나 만들어보자.
# random_pop.py
import random
def random_pop(data):
number = random.randint(0, len(data)-1)
return data.pop(number)
if __name__ == "__main__":
data = [1,2,3,4,5]
while data: print random_pop(data)
결과값:
2
3
1
5
4
위의 random_pop 함수는 리스트의 요소 중에서 무작위로 하나를 선택하여 꺼낸 다음 그 값을 돌려주는 함수이다. 물론 꺼내어진 리스트의 요소는 사라진다.
파이썬에서의 쓰레드 (thread)
동작하고 있는 프로그램을 프로세스(Process)라고 한다. 보통 한 개의 프로세스는 한 가지의 일을 하지만, 이 쓰레드를 이용하면 한 프로세스 내에서 두 가지 또는 그 이상의 일을 동시에 할 수 있게 된다. 간단한 예제로 설명을 대신 하겠다.
# thread_test.py
import thread
import time
def say(msg):
while 1:
print msg
time.sleep(1)
thread.start_new_thread(say, ('you',))
thread.start_new_thread(say, ('need',))
thread.start_new_thread(say, ('python',))
for i in range(100):
print i
time.sleep(0.1)
위 예제에서는 새로운 쓰레드를 세 개 만들었다. 1초마다 'you', 'need', 'python' 을 찍게 만드는 프로그램이다. 그리고 매 0.1초마다 0부터 99까지 숫자를 출력하게 하였다. 마지막 for가 사용된 부분이 Main 쓰레드가 된다.
결과값은 다음과 같을 것이다.
0
you
need
python
1
2
3
4
5
6
7
8
9
10
you
need
python
11
12
...
이것을 가능하게 해주는 것은 thread.start_new_thread로서 그 첫 번째 인수로는 함수명을, 두 번째 인수로는 그 함수의 입력 변수로 들어갈 터플 형태의 입력 인수를 받는다. 내장함수인 apply와 동일한 구조이다.
웹브라우저 실행시키기 (webbrowser)
webbrowser는 자신의 시스템에서 사용하는 기본 웹브라우저가 자동으로 실행되게 하는 모듈이다.
아래의 예는 웹브라우져를 자동으로 실행시키고 해당 URL인 http://www.yahoo.co.kr로 가게 해준다.
>>> import webbrowser
>>> webbrowser.open("http://www.yahoo.co.kr")
webbrowser의 open 함수는 웹브라우저가 실행된 상태이면 해당 주소로 이동하고 웹브라우저가 실행되지 않은 상태이면 새로이 웹브라우저가 실행되어 해당 주소로 이동한다.
open_new 함수는 이미 웹브라우저가 실행된 상태에서 새로운 창으로 해당 주소가 열리도록 한다.
>>> webbrowser.open_new(http://www.yahoo.co.kr)
출처 : wikidocs 점프 투 파이썬
'Python > 점프 투 파이썬' 카테고리의 다른 글
[01] 내가 프로그램을 만들 수 있을까? (0) | 2012.04.20 |
---|---|
06. 어디서부터 시작할 것인가? (0) | 2012.04.20 |
05. 파이썬 날개달기 4) 라이브러리 [1] 내장함수 (0) | 2012.04.20 |
05. 파이썬 날개달기 4) 라이브러리 (0) | 2012.04.20 |
05. 파이썬 날개달기 3) 예외처리 (0) | 2012.04.13 |
댓글