[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한 스크립트를 만들다면 필수적으로 알아둬야 할 사항이다.
댓글