본문 바로가기
Python/왕초보를 위한 파이썬

10.1. DIR 흉내내기

by 가므자 2012. 4. 12.

이제부터는 기본 문법을 응용해서 프로그램을 작성해보기로 했지요?

처음엔 간단한 것부터 시작해서 차근차근 공부해나가기로 해요.

오늘의 문제는 MS-DOS의 DIR 명령을 흉내내는 프로그램을 작성하는 것입니다.

DIR은 아래 그림과 같이 현재 디렉토리(폴더)에 속해있는 파일과 디렉토리들을 보여주는 명령이지요.

아주 간단한 것 같지만 직접 만들어보려고 하면 예상외로 신경 쓸 것이 많답니다.

우리가 만들 프로그램이 어떻게 동작해야 할지 생각해볼까요?

윗부분에는 현재 위치한 드라이브의 레이블과 일련번호, 디렉터리 이름을 표시합니다.

그 다음은 현재 디렉터리에 들어있는 파일과 디렉터리를 하나씩 검사해서 이름과 크기, 만들어진 날짜 등을 표시합니다.

마지막으로 파일 개수와 파일을 모두 합한 크기, 디렉터리의 개수, 드라이브의 남은 용량을 표시하구요.

파일과 디렉토리는 운영체제가 관리해주기 때문에 우리가 이런 프로그램을 만들려면 운영체제의 도움을 받아야하지요.

파이썬에서는 운영체제에 관련된 일을 처리할 수 있도록 몇 가지 모듈을 제공한답니다.

그러면 어느 모듈을 어떻게 써야할까요?

Windows 시작메뉴의 <Python 2.1>에서 <Python Manuals>를 클릭해보세요.

여기에는 파이썬에 대한 여러 가지 문서들이 있는데, 그 중에 Library Reference라는 것이 있습니다.

‘베게 밑에 넣어두세요(keep this under your pillow)’라고 써있는 거요. 찾으셨죠?

라이브러리 레퍼런스는 파이썬의 문법과 온갖 모듈들의 사용법을 담고 있답니다.

당근 우리가 찾는 모듈의 사용법도 여기에 있겠죠?

우리가 찾는 것들은 바로 6. Generic Operating System Services라는 곳에 나와있습니다.

문서를 대충 훑어보면서 그동안 주워들은 풍월을 조합해보니 os와 os.path, 그리고 time 모듈 정도를 사용하면 문제를 해결할 수 있을 듯하네요.

레퍼런스는 전부 영어로 되어있지요… 기가 죽으십니까… --;

걱정마세요. 파이썬 정보광장에 한글로 번역된 레퍼런스도 있으니까요.

앞으로 우리말로 된 책도 많이 나올거구요.

그럼 제가 짠 프로그램을 보여드리겠습니다.

이 프로그램은 dirCmd()와 getModTime() 두 개의 함수로 구성했습니다.

앞의 함수는 위에서 말씀드린 일들을 모두 처리하는 주 함수이구요, 뒤의 것은 파일이 만들어진 날짜를 표시하기 위해 사용할 함수입니다.

먼저, 앞으로 사용할 모듈을 import 해둡니다.

import os, time, string

os.path도 사용할 것이지만, os.path는 os 모듈에 속해있기 때문에 굳이 지정해주지 않아도 됩니다.

string 모듈은 나중에 getModTime()함수에서 사용하게 되어서 써주었구요.

def dirCmd():

""" 주 함수 """

dir = os.getcwd()

print '\n디렉터리', dir, '\n'

for f in os.listdir(dir):

# 경로명

path = os.path.join(dir, f)

# <DIR> 또는 파일 크기

if os.path.isdir(path):

size = '<DIR>' + ' '*6

else:

size = os.path.getsize(path)

# 작성일시

mdate, mtime = getModTime(path)

# 파일명

fname = f

# 모두 출력

print '%11s %s %5s %s' % (size, mdate, mtime, fname)

주함수인 dirCmd()에서는 os모듈의 getcwd() 함수를 사용하여 현재 디렉터리를 구해 출력해준 다음, listdir() 함수를 써서 현재 디렉토리에 속한 파일과 디렉터리들의 리스트를 얻어서 바로 for 문을 돌렸습니다.

이 부분 이해되시죠? listdir() 함수의 return 값이 리스트이기 때문에 이렇게 써도 되는 것입니다.

다음 줄부터는 모두 for 문에 속해있어서, 파일 각각에 대해 수행하게 됩니다.

join 함수는 아래와 같이 경로명을 연결해주는 함수입니다.

>>> os.path.join('C:\\Python21', 'Lib')

'C:\\Python21\\Lib'

프로그램에서 os.path.join(dir, f)는 현재 디렉터리 dir과 listdir()의 결과값으로 나오는 리스트의 원소 f를 연결하여 완전한 경로를 만들어주도록 했지요.

이제 이렇게 만들어진 경로명을 isdir 함수에 넣으면 이것이 디렉터리인지 파일인지 판별을 해줍니다.

결과가 디렉터리로 밝혀지면 ‘DIR’이라고 출력하고 파일이라면 파일 크기를 출력할 것인데, 출력은 나중에 한꺼번에 하려고 출력할 말을 size라는 변수에 넣어두었지요.

파일이 작성된 날짜와 시각은 따로 getModTime 함수를 만들어서 얻어낼거구요.

파일명은 그냥 f를 받아서 쓰면되겠군요.

끝으로 파일에 대한 정보들을 한줄로 출력해줍니다.

이 정보들은 길이가 제각각인지라 그냥 붙여서 출력하면 알아보기 힘들 테니, 문자열 포매팅으로 예쁘게 출력하도록 하였구요.

문자열 포매팅(formatting) 방법은 다음과 같습니다.

>>> name = '철수'

>>> age = 5

>>> print '%s는 %d살입니다.' % (name, age)

철수는 5살입니다.

자세히 알고 싶으시면 튜토리얼의 7.1 Fancier Output Formatting(좀 더 예쁘게 출력하기)나 레퍼런스의 2.1.5.2 String Formatting Operations를 참고하세요.

파일 크기인 size는 최대 11자까지 찍을 수 있도록 자리를 정해주었는데, 이렇게 자릿수를 지정하면 자동으로 오른쪽 정렬이 됩니다.

파일이 만들어진 날짜 mdate는 그냥 출력하고, 시각 mtime은 다섯 자리를 주었습니다.

파일명 fname은 그냥 찍으면 되겠지요.

이제 중간 점검을 해보시는 것도 괜찮겠네요.

맨 뒤에 다음과 같이 써주세요.

if __name__ == '__main__':

dirCmd()

이 문장은 이 파일이 프로그램 파일로서 사용되면 dirCmd()함수를 호출하라는 뜻입니다.

만약 if 문 없이 dirCmd()라고만 써주면 이 파일을 import 할 때에도 dirCmd() 함수를 호출하겠죠.

또, getModTime() 함수는 아직 만들지 않았으니까 이것을 호출하는 부분은 주석 처리하거나 빼두셔야 오류가 생기지 않겠죠?

이제 dir.py라고 저장하신 후에 아래와 같이 실행 시켜보세요.

C:\Python21>python exam\dir.py

잘 돌아가나요?

잘 되시면 야호! 한 번 하시고 한숨 돌리시지요. 아저씨들은 담배 한 대 피고 오시고요.

이제 파일이 만들어진 날짜와 시각을 구하는 함수가 남았네요.

def getModTime(path):

""" 파일이 만들어진 날짜와 시각을 구함 """

et = os.path.getmtime(path) # path의 작성일시(epoch 형식)

lt = time.localtime(et) # local 형식으로 변환

yy = string.zfill(`lt[0] % 100`, 2) # 공백을 0으로 채워 두자리 수 만듦

mm = string.zfill(`lt[1]`, 2)

dd = string.zfill(`lt[2]`, 2)

mdate = yy + '-' + mm + '-' + dd

h = `lt[3]`

m = `lt[4]`

mtime = h + ':' + m

return mdate, mtime

os.path.getmtime이라는 함수를 사용하면 파일의 작성 시각을 구할 수 있긴 한데, 이것은 시각을 특이하게 표시합니다.

>>> p = 'c:/python21/py.ico'

>>> os.path.getmtime(p)

880470848

위에서 py.ico 파일이 만들어진 시각을 알아봤더니 길다란 숫자 하나만 돌려줬지요?

이 숫자는 1970년 1월 1일 0시로부터 몇 초가 지났는지를 나타낸답니다. 별꼴이네요…

이런 형식을 epoch라고 하는데, 이걸 우리가 쓰는 년월일, 시분으로 나타내려면 time 모듈에서 제공하는 localtime 함수를 사용해서 변환하면 됩니다.

이 함수는 아래처럼 epoch 형식의 시각을 년, 월, 일, 시, 분, 초, 요일, 줄리안 데이, 일광절약시간으로 바꿔준답니다.

줄리안 데이는 날짜를 365일 중에 며칠 째인지로 표시하는 방법으로 컴퓨터 내부에서 사용한다고 하네요.

정말 희한하죠…

>>> time.localtime(880470848)

(1997, 11, 26, 0, 14, 8, 2, 330, 0)

string 모듈의 zfill 함수는 어떤 문자열을 자리수를 맞춰서 출력하되, 길이가 짧은 경우는 공백을 0으로 채워주는 일을 합니다.

>>> n = '123'

>>> string.zfill(n, 5)

'00123'

zfill 함수의 인자로는 문자열을 넘겨줘야하기 때문에 프로그램에서는 `lt[0]`과 같이 역인용부호(`)를 써서 문자열로 변환해주었지요.

다음을 보시면 따옴표와 역인용부호가 어떻게 다른지 아실 거예요.

>>> 1+2

3

>>> '1+2' # 그냥 따옴표

'1+2'

>>> `1+2` # 역 인용부호

'3'

이제 getModTime()도 만들었으니 모두 끝났습니다. 빨래 끝~

간단한 프로그램인데도 주저리주저리 설명드릴 것이 많았네요.

다시 찬찬히 읽어보고 따라해보시면 그리 어렵지 않을 거예요.

제가 미처 구현하지 못한 기능을 추가해보는 것도 좋겠구요.

그럼 행복하세요~

출처 : wikidocs 왕초보를 위한 파이썬

'Python > 왕초보를 위한 파이썬' 카테고리의 다른 글

11.1. 웹에서 정보 얻기  (0) 2012.04.12
11. 네트워크  (0) 2012.04.12
10. 시스템  (0) 2012.04.12
9.1. Tkinter에서 마우스 이벤트 처리  (0) 2012.04.12
09. GUI  (0) 2012.04.12

댓글