파이썬으로 파일 및 디렉터리 목록 구하기

Python // 2024년 05월 30일 작성 // 2024년 06월 01일 업데이트

파이썬으로 파일과 디렉터리 목록을 구하는 방법은 여러 가지가 있겠지만 여기서는 listdir 및 rglob를 사용하는 방법을 정리한다.

listdir - 특정 디렉터리 탐색

단순하게 특정 디렉터리의 목록만 구하고 싶다면 os.listdir() 함수를 이용할 수 있다.

>>> import os
>>> os.listdir('.')
['foo.a', 'bar.b', 'somedir', ...]

당연하겠지만 입력으로 사용한 '.'은 현재 디렉터리를 의미한다. 여기다 원하는 경로를 넣을 수 있다.

glob - 패턴 기반 특정 디렉터리 탐색

globos.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()의 파일 이름 패턴은 이 외의 다양한 패턴을 지원하므로 궁금하다면 매뉴얼을 찾아보자.