[번역] 파이썬 utility 모듈들


Table of Contents

파이썬 수업

  • Python 환경 설정 파이썬을 실행할 수 있는 환경을 설정한다.
  • Introduction 파이썬의 가장 기본적인 내용들을 다룬다.
  • Strings 파이썬의 string 클래스 사용법을 다룬다.
  • Lists 파이썬의 리스트 타입과 그 method를 다룬다.
  • Sorting 리스트등을 원하는 key 로 sorting 하는 법을 다룬다.
  • Dictionaries and Files dictionary, file, 파일 인코딩에 대해 다룬다.
  • Regular Expressions 정규식표현을 이용한 검색등에 대해 다룬다.
  • Utilities 자주 사용하는 파이썬 모듈들을 다룬다.

파이썬 연습 문제

Python Utilities

이 섹션에서, 자주 사용되는 파이썬 standard utility 모듈들 몇개를 살펴볼 것이다.

File System — os, os.path, shutil

osos.path 모듈은 파일 시스템에 관련된 작업을 하기 위한 많은 함수들을 제공한다. shutil 모듈을 이용하여 파일들을 복사할 수 있다.

  • os module docs
  • filenames = os.listdir(dir) — dir 에 있는 파일이름들의 리스트 (. 와 .. 를 포함하지 않는다). 파일이름들은 디렉토리에서의 이름으로, 절대 경로가 아니다.
  • os.path.join(dir, filename) — 위에서 받은 형태의 filename 과 dir 을 합쳐서 path 를 만든다
  • os.path.abspath(path) — path 를 받아서, 절대 경로를 리턴한다. /home/nick/foo/bar.html 처럼 말이다
  • os.path.dirname(path), os.path.basename(path) — dir/foo/bar.html 을 받아서, dirname “dir/foo” 와 basename “bar.html” 을 리턴한다
  • os.path.exists(path) — path 가 존재하면 true 를 리턴한다
  • os.mkdir(dir_path) — dir 하나를 만든다, os.makedirs(dir_path) 는 dir_path 를 만들기 위한 모든 디렉토리들을 만든다
  • shutil.copy(source-path, dest-path) — 파일을 복사한다 (복사될 파일의 디렉토리가 존재해야 한다)

    dir 에서 filename 들을 가져와서, 상대 경로와 절대경로를 프린트한다

    def printdir(dir): filenames = os.listdir(dir) for filename in filenames: print filename ## foo.txt print os.path.join(dir, filename) ## dir/foo.txt (현재 디렉토리에 상대 경로) print os.path.abspath(os.path.join(dir, filename)) ## /home/nick/dir/foo.txt

help()dir() 함수를 이용하여 파이썬 모듈들에 대한 도움을 받을 수 있다. 인터프리터에서 “import os” 를 입력하고, 다음 명령어를 입력하여 모듈에서 제공하는 것들을 살펴보라: dir(os), help(os.listdir), dir(os.path, help(os.path.dirname).

Running External Processes — commands

commands 모듈은 외부 명령을 실행하고 결과물을 얻어올 수 있는 방법을 제공한다.

  • commands module docs
  • (status, output) = commands.getstatusoutput(cmd) — cmd 를 실행하고 exit 할때까지 기다려서, status int 값과 결과 text 를 tuple 로 리턴한다. standard output 과 standard error 가 하나의 출력물로 합쳐져서 나타난다. cmd 가 실패하면 status 가 0 이 아닌 값이 될 것이다. standard error 를 출력하기 때문에, 실패할 때, 무슨일이 발생했는지 출력할 수 있다.
  • output = commands.getoutput(cmd) — 위와 동일하다. status 값을 받지 않는다는 것만 다르다.
  • commands.getstatus() 라는 함수가 있는데, 사용하지 말아라 — method 이름을 잘못 지은 예이다!
  • sub-process 에 대한 더 많은 제어권을 원하면 “popen2” 모듈을 보라. (http://docs.python.org/lib/module-popen2.html)
  • cmd 를 실행하고 cmd 의 결과물을 여러분 코드의 output 으로 출력하고, error 코드를 리턴하는 간단한 os.system(cmd) 도 있다. 명령을 실행해서 출력물을 여러분 python 코드의 자료구조로 저장할 필요가 없을 때 사용할 수 있다.

    dir 을 입력받아, ls -l 을 실행한다

    def listdir(dir): cmd = ‘ls -l ‘ + dir print “Command to run:”, cmd ## 실제로 실행하기 전에, 실행할 명령어를 보는 것도 좋다 (status, output) = commands.getstatusoutput(cmd) if status: ## 에러가 발생했다. command 의 출력물을 stderr 로 출력하고 종료한다 sys.stderr.write(output) sys.exit(1) print output ## 에러가 없으면, 결과를 가지고 무엇인가를 한다.

Exceptions

exception 은 실행중 발생하는 error 로, 정상적인 실행을 멈추고, 에러 처리 코드에게 실행 제어권을 넘긴다. 이 섹션에서는 exception 의 가장 기본적인 사용법을 소개한다. 프로그램상에 변수가 선언되어 있지 않은데 사용할 때 에러가 발생하고 (ValueError .. 몇번 보았을지도 모르겠다), 파일이 존재하지 않는데 파일 관련 작업을 수행할 때에도 에러 (IOError) 가 발생한다. (자세한 내용은 [[http://docs.python.org/tut/node10.html][exception docs]] 을 참조하기 바란다)

에러를 처리하는 코드가 없다면 (여태껏 우리가 해온 것처럼), 실행중 발생하는 exception 으로 인해, 프로그램이 멈추게 된다. “try/except” 구조를 이용하여 exception 을 처리할 수 있다:

  try:
    ## 다음 두 줄은 IOError 를 발생시킬 수 있다
    ## 파일이 존재하지 않거나, 파일이 존재하더라도 read() 에서 에러가 발생할 수도 있다.
    f = open(filename, 'rU')
    text = f.read()
    f.close()
  except IOError:
    ## IOError 가 발생하면, 실행을 멈추고 여기로 온다. 그리고 이 곳의 코드가 실행된다.
    sys.stderr.write('problem reading:' %2B filename)
  ## 에러의 발생 유무와 상관없이, try/except 를 지난 후에는, 이곳의 code 를 실행한다.

try: 섹션은 exception 을 발생시킬 수 있는 코드를 포함한다. except: 섹션은, exception 이 발생했을 때 실행할 코드를 가지고 있다. exception 이 발생하지 않으면, except: 섹션은 무시된다 (즉, except: 의 코드는 에러 처리를 위한 코드이다, “일반” 적인 경우에는 실행되지 않는다). exception 객체에 대한 포인터를 “except IOError, e: ..” 의 형태로 얻어올 수 있다. e 가 exception 객체를 가리킨다.

HTTP — urllib and urlparse

urllib 은 url 에 관련된 기능을 제공한다 — url 을 마치 file 처럼 읽을 수 있게 한다. urlparse 모듈은 url 을 분해하거나 합치는 기능을 제공한다.

  • urllib module docs
  • ufile = urllib.urlopen(url) — url 에 대한 file 같은 객체를 리턴한다
  • text = ufile.read() — 파일처럼 읽을 수 있다 (readlines() 등을 사용할 수도 있다)
  • info = ufile.info() — 이 요청에 대한 meta 정보를 리턴한다. info.gettype() 으로 ‘text/html’ 같은 mime 타입을 얻어온다.
  • baseurl = ufile.geturl() — 요청에 대한 “base” url 을 얻어온다. redirect 로 인해 open 할 때 사용한 url 과 다를 수 있다.
  • urllib.urlretrieve(url, filename) — url 의 데이터를 다운받아 file 로 저장한다
  • urlparse.urljoin(baseurl, url) — url 과 페이지를 얻어온 baseurl 로부터 full url 을 만든다 (url 이 이미 full url 이어도 사용할 수 있다). 위 geturl() 로 baseurl 을 얻어올 수 있다.

    url 의 데이터를 얻어온다. text/html 타입인 경우에 말이다.

    base url 과 text 를 출력한다.

    def wget(url): ufile = urllib.urlopen(url) ## url 에 대한 파일-같은 객체를 얻어온다 info = ufile.info() ## url 의 내용에 대한 meta 정보 if info.gettype() == ‘text/html’: print ‘base url:’ + ufile.geturl() text = ufile.read() ## 모든 text 를 읽는다 print text

위 코드느 잘 동작한다, 하지만 어떤 이유로, url 을 이용할 수 없을 때 에러를 처리하지는 않는다. url 작업이 실패할 경우 try/except 로 처리하는 코드를 넣은 버전은 다음과 같다:

## try/except 로 urlopen() 이 실패하였을 경우에 에러 메시지를 프린트 한다
def wget2(url):
  try:
    ufile = urllib.urlopen(url)
    if ufile.info().gettype() == 'text/html':
      print ufile.read()
  except IOError:
    print 'problem reading url:', url

Exercise

파일 시스템과 외부 명령을 실행에 대한 연습을 하고 싶으면 Copy Special Exercise 를 보라. urllib 에 대해 연습하려면, Log Puzzle Exercise 를 보라.

 

 

http://codeflow.co.kr/question/1063/%ED%8C%8C%EC%9D%B4%EC%8D%AC-utility-%EB%AA%A8%EB%93%88%EB%93%A4/


답글 남기기

이메일 주소는 공개되지 않습니다.