파이썬으로 파일 및 디렉터리 목록 구하기
파이썬으로 파일과 디렉터리 목록을 구하는 방법은 여러 가지가 있겠지만 여기서는 listdir 및 rglob를 사용하는 방법을 정리한다.
listdir - 특정 디렉터리 탐색
단순하게 특정 디렉터리의 목록만 구하고 싶다면 os.listdir()
함수를 이용할 수 있다.
>>> import os
>>> os.listdir('.')
['foo.a', 'bar.b', 'somedir', ...]
당연하겠지만 입력으로 사용한 '.'
은 현재 디렉터리를 의미한다. 여기다 원하는 경로를 넣을 수 있다.
glob - 패턴 기반 특정 디렉터리 탐색
glob
로 os.listdir
과 비슷하게 특저 디렉터리의 디렉터리나 파일 리스트를 구하는 용도로 사용할 수 있는데 특징으로는 패턴을 이용할 수 있다는 점이 있다.
>>> from glob import glob
>>> for path in glob("/foo/bar/*.txt"):
... print(path)
/foo/bar/qwer.txt
/foo/bar/tyui.txt
/foo/bar/asdf.txt
...
위와 같은 코드로 /foo/bar
디렉터리 아래에서 패턴으로 *.txt
즉 확장자가 txt
인 파일의 목록을 구할 수 있다.
rglob - 특정 디렉터리 및 그 아래의 모든 서브 디렉터리 탐색
특정 디렉터리 안의 내용물을 서브(자식) 디렉터리까지 다 포함해서 목록을 구할려면 여러 방법이 있겠지만 이번에는 Python 3.4 에서 추가된 pathlib
모듈의 Path
클래스의 rglob()
메서드를 이용해보자.
>>> from pathlib import Path
>>> list(Path("/foo/bar/dir").rglob("*"))
[PosixPath('/foo/bar/dir/a'), PosixPath('/foo/bar/dir/a/test.txt'), ...]
PosixPath
라는 새로운 타입이 등장하는데 이름처럼 경로를 표기하는데 적합한 타입이다. 이 타입은 별로 어려울 것 없이 str()
로 문자열로 변환이 되니 익숙한 방법을 사용하면 된다.
어쨌든 이런 식으로 해당 디렉터리 아래의 모든 파일과 디렉터리 목록을 1차원 리스트로 가공된 결과를 얻을 수 있다. 거기다 glob
와 비슷하게 패턴까지 사용할 수도 있다.
굳이 list()
를 이용해 리스트화를 한 이유는 결과를 바로 보기 위함이다. 보통 이런 경우 generator가 리턴된 것이기 때문에 굳이 list()
로 바로 풀어버릴 필요 없이 바로 for 루프를 돌면서 필요한 처리를 하는 게 성능과 메모리 효율이 더 좋을 것이다.
>>> for p in Path("/Users/seorenn/tmp/a").rglob("*"):
... print(p)
...
/foo/bar/dir/a
/foo/bar/dir/a/test.txt
...
참고로 rglob()
의 파일 이름 패턴은 이 외의 다양한 패턴을 지원하므로 궁금하다면 매뉴얼을 찾아보자.