HOME > python > examples

Python - 모든 하위 폴더, 파일 탐색하는 방법

By JS | 02 Dec 2019

어떤 경로의 모든 하위 폴더와 파일을 탐색하고 싶을 때가 있습니다. 만약 어떤 이름의 파일을 찾는다거나, 내부 파일을 정리해서 화면에 보여준다던지 그런 이유로요.

다음 두개의 API를 사용하면 이런 작업을 처리할 수 있습니다.

  • os.listdir()
  • os.walk()

각각 예제와 함께 알아보겠습니다.

os.listdir()을 이용한 방법

먼저 우리가 탐색할 경로의 파일 구조는 다음과 같습니다.

test$ tree
.
├── file1.txt
├── folder1
│   └── file2.txt
├── folder2
│   ├── file3.txt
│   └── file4.txt
└── folder3
    ├── file5.txt
    ├── file6.txt
    └── folder4
        ├── text2.txt
        ├── text3.txt
        └── text.txt

os.listdir()는 인자로 전달된 dir의 모든 파일을 출력해 줍니다.

다음은 os.listdir()에 root dir인 ./test/를 인자로 전달하여 모든 파일들을 출력해주는 예제입니다.

import os

def print_files_in_dir(root_dir, prefix):
    files = os.listdir(root_dir)
    for file in files:
        path = os.path.join(root_dir, file)
        print(prefix + path)


if __name__ == "__main__":
    root_dir = "./test/"
    print_files_in_dir(root_dir, "")

결과

./test/folder1
./test/file1.txt
./test/folder3
./test/folder2

os.listdir()는 인자 내부에 있는 파일만 출력해주고, 그 파일이 폴더라면 그 내부의 파일들은 출력해주지 않습니다. 이런 것을 처리하고 싶다면, 재귀(recursive)로 처리해주면 됩니다.

다음은 재귀로 모든 하위 파일들을 출력해주는 예제입니다.

import os

def print_files_in_dir(root_dir, prefix):
    files = os.listdir(root_dir)
    for file in files:
        path = os.path.join(root_dir, file)
        print(prefix + path)
        if os.path.isdir(path):
            print_files_in_dir(path, prefix + "    ")

if __name__ == "__main__":
    root_dir = "./test/"
    print_files_in_dir(root_dir, "")

결과

./test/folder1
    ./test/folder1/file2.txt
./test/file1.txt
./test/folder3
    ./test/folder3/file5.txt
    ./test/folder3/folder4
        ./test/folder3/folder4/text3.txt
        ./test/folder3/folder4/text2.txt
        ./test/folder3/folder4/text.txt
    ./test/folder3/file6.txt
./test/folder2
    ./test/folder2/file3.txt
    ./test/folder2/file4.txt

os.walk()를 이용한 방법

위와 유사한 구현 내용을 os.walk()로 처리할 수 있습니다.

os.walk()는 하위의 폴더들을 for문으로 탐색할 수 있게 해줍니다. 인자로 전달된 path에 대해서 다음 3개의 값이 있는 tuple을 넘겨줍니다.

  • root : dir과 files가 있는 path
  • dirs : root 아래에 있는 폴더들
  • files : root 아래에 있는 파일들

예제는 다음과 같습니다. 모든 하위 폴더들에 대해서 for문이 실행되며, root는 그 폴더의 path가 됩니다. dirs와 files는 root 바로 밑에 있는 폴더와 파일들에 대한 리스트입니다.

import os

if __name__ == "__main__":
    root_dir = "./test/"
    for (root, dirs, files) in os.walk(root_dir):
        print("# root : " + root)
        if len(dirs) > 0:
            for dir_name in dirs:
                print("dir: " + dir_name)

        if len(files) > 0:
            for file_name in files:
                print("file: " + file_name)

결과

# root : ./test/
dir: folder1
dir: folder3
dir: folder2
file: file1.txt
# root : ./test/folder1
file: file2.txt
# root : ./test/folder3
dir: folder4
file: file5.txt
file: file6.txt
# root : ./test/folder3/folder4
file: text3.txt
file: text2.txt
file: text.txt
# root : ./test/folder2
file: file3.txt
file: file4.txt

기본적으로 top-down 순서로 출력됩니다. 최하위 폴더에서 상위 폴더를 출력하는 bottom-up으로 탐색하고 싶다면 다음과 같이 topdown=False를 인자를 전달하면 됩니다.

os.walk(root_dir, topdown=False)

참고