2011년 2월 21일 월요일

[Python] Directory(Folder) / File 목록 다루기

__file__ 은 현재 스크립트 파일 이름을 의미한다. 즉 test.py라는 파일에서 print __file__을 넣어놓고 실행해보면 'test.py'라는 문자열이 출력된다. (불행히도 인터프리터로 테스트를 해 볼 수는 없다. 왜냐하면 자신의 파일 이름(__file__)이 없으니까 -ㅁ-)

os 모듈에는 파일 경로 처리를 도와줄 path라는 모듈이 있다. 한 가지 예로
import os
print os.path.dirname(__file__)
을 test.py에 넣고 실행시켜 보면 … 아마 아무것도 안나올거다 -_-;

하지만 test.py파일을 test라는 디렉토리에 넣고 그 상위 디렉토리에서 실행해보면 'test' 라는게 표시될 것이다. dirname이라는 심볼에서 알 수 있듯이 이 파일이 위치하고 있는 상대경로(relative-path)가 표시된다.

그럼 파일의 절대경로를 얻어보자
print os.path.realpath(os.path.dirname(__file__))
파일 이름을 제외하고 자신(test.py)의 절대경로를 얻을 수 있다.

경로 조합을 해 보자
os.path.join('testdir', 'dir1')
Linux나 Unix라면 'testdir/dir1'이 리턴될 것이고 윈도우라면 'testdir\\dir1'이 리턴될 것이다. os에 따른 구분을 알아서 해 주는 친절한 Python이다. 물론 반대로 split()도 있으나 생략.

그럼 파일의 절대경로를 얻으려면 이렇게 쓰면 되겠구나
os.path.join(os.path.realpath(os.path.dirname(__file__)), __file__)
잘 된다. 그런데 사실 이건 이렇게 써도 된다.
os.path.realpath(__file__)
훗…;;;

os.path는 굉장히 기능이 많다. 왠만한 것은 구비되어 있으니 억지로 만들지 말고 문서를 보자.

이제는 파일 목록을 한번 읽어보자.
os.listdir('./')
현재 디렉토리의 파일과 디렉토리 목록이 리스트로 돌아온다.

os.listdir()로 특정 경로의 파일/디렉토리 목록을 읽어올 수 있지만, 만약 특정 확장자의 파일을 읽고 싶다면 어떻게 할 것인가.
import glob
glob.glob('./*.py')
현재 디렉토리의 .py 파일만 목록으로 돌아온다. 비슷하게, 대소문자를 구분하지 않고 싶다면 glob.iglob()을 사용하면 된다.

이로써 목록을 읽어왔다. 하지만 디렉토리와 파일이 구분되지 않는다. 어떻게 구분할까? 다음 문서를 읽어보면 읽어보자 라고 말하고 싶기도 하고 아니기도 하고 어쩌라는 건지 아 귀찮아 궁시렁 궁시렁
http://docs.python.org/library/stat.html
시간이 남아돌아서 위 문서를 읽어보면 괜히 stat에 관해서 알 수 있다. 아주 기능이 다양하다. 아랫쪽의 예제를 보니 굉장히 기능이 많다. (즉 귀찮다 -ㅁ-)

os.path에 관한 레퍼런스 문서를 읽어봤다면 알 수 있겠지만, 다행히도 이미 파일/디렉토리 구분을 위한 API가 지원된다.
  • os.path.isfile(path)
  • os.path.isdir(path)
친절해라…

이 밖에 os.path에는 파일 존재여부를 다루는 exsits()도 있고 사이즈를 읽어올 수 있는 getsize()도 있고 정말 기능이 많다.

ps. 디렉토리나 파일 경로 조합을 할 때는 Python의 기본 String의 기능을 이용하지 말고 os.path의 기능을 이용하길 추천한다. 앞서 이미 언급했지만 디렉토리 구분자를 OS에 맞게 자동으로 넣어준다. cross-platform한 스크립트를 만들다면 필수적으로 알아둬야 할 사항이다.

댓글 없음 :