콘텐츠로 건너뛰기

파이썬으로 디렉토리 내 모든 파일 나열 방법

[

파이썬으로 디렉토리의 모든 파일 나열 방법

파이썬에서 파일 관련 작업을 수행할 때, 디렉토리의 모든 파일과 폴더 목록을 얻는 것은 자연스러운 첫 번째 단계입니다. 그러나 다양한 방법이 있음을 알게 되면 놀라실 수 있습니다.

어떤 작업을 하는 다양한 방법을 마주할 때, 문제에 일반적으로 해결책이 없다는 것을 알 수 있습니다. 대부분의 경우, 각각의 해결책은 각자의 장점과 트레이드오프를 가질 것입니다. 이는 파이썬에서 디렉토리의 내용물을 나열하는 것에도 해당됩니다.

문자열로 경로를 다룬다는 것은 처음에는 괜찮아 보일 수도 있지만, 여러 운영체제를 섞어 쓰기 시작하면 더 복잡해집니다. 또한 파일 경로와 관련된 문자열 조작에 대한 코드가 많아져서 파일 경로가 무엇인지와 너무 멀어질 수 있습니다. 것들은 꽤 빨리 난해해질 수 있습니다.

이는 문자열로 경로를 다루는 것이 불가능하다는 뜻이 아닙니다. 결국, 개발자들은 많은 해녀 름없이 오랜 기간 동안 pathlib없이도 잘 관리했습니다! pathlib 모듈은 매우 다양한 어려운 부분들을 처리해주고, 코드의 주된 로직에 집중할 수 있도록 해줍니다.

먼저, OS에 따라 다른 Path 객체를 생성하는 것으로 모든 것이 시작됩니다. Windows에서는 WindowsPath 객체를 반환하고, Linux 및 macOS에서는 PosixPath 객체를 반환합니다:

  • Windows
  • Linux + macOS
import pathlib
desktop = pathlib.Path("C:/Users/RealPython/Desktop")
desktop
WindowsPath("C:/Users/RealPython/Desktop")
import pathlib
desktop = pathlib.Path("/home/RealPython/Desktop")
desktop
PosixPath('/home/RealPython/Desktop')

이러한 OS에 대응하는 객체를 사용하면 다양한 메소드와 속성을 활용할 수 있습니다.

모든 파일과 폴더를 가져오는 방법

모든 파일과 폴더의 목록 가져오기

import pathlib
# 현재 작업 디렉토리를 Path 객체로 반환
current_directory = pathlib.Path.cwd()
# 디렉토리 내 모든 파일과 폴더를 가져오기 위해 iterdir() 메소드 사용
all_items = current_directory.iterdir()
# 리스트로 변환하여 모든 항목 목록 얻기
all_items_list = list(all_items)
print(all_items_list)

위의 예제 코드를 실행하면 현재 작업 디렉토리의 모든 파일과 폴더를 포함하는 리스트가 출력됩니다.

파일만 가져오기

만약 디렉토리 내에서 파일만 가져오고 싶다면, iterdir() 메소드를 사용한 후 파일인지 아닌지 체크해야 합니다. 파일인 경우, is_file() 메소드가 True를 반환합니다.

import pathlib
current_directory = pathlib.Path.cwd()
all_items = current_directory.iterdir()
# 파일만 가져오기
files_list = [item for item in all_items if item.is_file()]
print(files_list)

위의 코드는 디렉토리 내 파일만을 포함하는 리스트를 출력합니다.

폴더만 가져오기

폴더만 가져오고 싶다면, iterdir() 메소드를 사용한 후 폴더인지 아닌지 체크해야 합니다. 폴더인 경우, is_dir() 메소드가 True를 반환합니다.

import pathlib
current_directory = pathlib.Path.cwd()
all_items = current_directory.iterdir()
# 폴더만 가져오기
folders_list = [item for item in all_items if item.is_dir()]
print(folders_list)

위의 코드는 디렉토리 내 폴더만을 포함하는 리스트를 출력합니다.

하위 디렉토리의 파일과 폴더 재귀적으로 나열하기

import pathlib
current_directory = pathlib.Path.cwd()
# 하위 디렉토리의 파일과 폴더 재귀적으로 나열
all_items_recursive = current_directory.rglob("*")
# 리스트로 변환하여 모든 항목 목록 얻기
all_items_recursive_list = list(all_items_recursive)
print(all_items_recursive_list)

위의 코드를 실행하면 디렉토리의 하위 디렉토리를 재귀적으로 탐색하며 모든 파일과 폴더를 포함하는 리스트를 출력합니다.

조건부 나열을 위한 Python Glob 패턴 사용

.glob() 메소드를 사용한 조건부 나열

.glob() 메소드를 사용하면 지정된 패턴과 일치하는 파일 또는 폴더 이름을 가진 Path 객체를 반환할 수 있습니다. * 와일드카드 문자는 0개 이상의 문자와 매치됩니다.

import pathlib
current_directory = pathlib.Path.cwd()
# 파일 이름이 'example_*.txt' 패턴과 일치하는 파일만 나열하기
pattern_files = current_directory.glob("example_*.txt")
pattern_files_list = list(pattern_files)
print(pattern_files_list)

위의 코드의 예는 현재 작업 디렉토리에서 ‘example_*.txt’ 패턴과 일치하는 파일을 찾습니다. * 와일드카드는 ‘example_‘로 시작하고 그 뒤에 어떤 문자열이라도 올 수 있는 파일과 매치됩니다.

.rglob() 메소드를 사용한 조건부 나열

.rglob() 메소드를 사용하면 지정된 패턴과 일치하는 파일 또는 폴더 이름을 가진 Path 객체를 재귀적으로 탐색하여 반환할 수 있습니다.

import pathlib
current_directory = pathlib.Path.cwd()
# 하위 디렉토리에서 파일 이름이 'example_*.txt' 패턴과 일치하는 파일만 나열하기
pattern_files_recursive = current_directory.rglob("example_*.txt")
pattern_files_recursive_list = list(pattern_files_recursive)
print(pattern_files_recursive_list)

위의 코드는 현재 작업 디렉토리의 하위 디렉토리에서 ‘example_*.txt’ 패턴과 일치하는 파일을 찾습니다.

Glob 메소드를 사용한 고급 매칭

Glob 패턴은 []를 사용하여 특정 문자 집합에 일치시킬 수도 있습니다. 예를 들어 [0-9]는 0부터 9까지의 어떤 숫자와도 매치되는 위치에 사용될 수 있습니다. ? 와일드카드 문자는 정확히 한 개의 문자와 매치됩니다.

import pathlib
current_directory = pathlib.Path.cwd()
# 현재 디렉토리에서 'example_0.txt' 또는 'example_1.txt' 파일만 나열하기
advanced_pattern_files = current_directory.glob("example_[01].txt")
advanced_pattern_files_list = list(advanced_pattern_files)
print(advanced_pattern_files_list)

위의 코드는 현재 작업 디렉토리에서 ‘example_0.txt’ 또는 ‘example_1.txt’ 파일을 찾습니다. [01] 패턴은 0 또는 1 숫자 및 어떤 문자열이든지 파일과 매치됩니다.

쓰레기 디렉토리 나열 방법 제외하기

.rglob() 메소드를 사용하면 전체 디렉토리를 필터링하여 쓰레기 디렉토리를 제외할 수 있습니다.

import pathlib
import shutil
current_directory = pathlib.Path.cwd()
# .rglob() 메소드를 사용하여 전체 디렉토리 필터링
filtered_directory = [item for item in current_directory.rglob("*") if not any(dir_name in item.parts for dir_name in ["env", "venv", ".git"])]
for item in filtered_directory:
if item.is_file():
print("File:", item)
elif item.is_dir():
print("Directory:", item)

위의 코드는 ‘env’, ‘venv’, ‘.git’과 같은 디렉토리가 포함되어 있지 않은 모든 파일과 폴더를 출력합니다.

재귀적인 .iterdir() 함수 생성하기

실제 pathlib 모듈에는 없지만, 재귀적으로 디렉토리의 파일과 폴더를 나열하기 위해 다음과 같이 .iterdir() 함수를 생성할 수 있습니다.

import pathlib
def iterdir_recursive(path):
for item in path.iterdir():
yield item
if item.is_dir():
yield from iterdir_recursive(item)
current_directory = pathlib.Path.cwd()
# 재귀적으로 디렉토리의 파일과 폴더 나열
all_items_recursive_custom = iterdir_recursive(current_directory)
# 리스트로 변환하여 모든 항목 목록 얻기
all_items_recursive_custom_list = list(all_items_recursive_custom)
print(all_items_recursive_custom_list)

위의 코드는 재귀적으로 디렉토리의 파일과 폴더를 차례로 출력합니다.

결론

이 튜토리얼에서 디렉토리의 모든 파일과 폴더를 나열하는 가장 일반적인 방법을 배웠습니다. pathlib 모듈을 사용하여 .iterdir().rglob() 메소드를 사용하는 방법을 알아보았습니다. 또한 .glob() 메소드를 사용하여 조건부로 파일과 폴더를 나열하는 방법도 살펴보았습니다. 또한, 재귀적인 파일 및 폴더의 나열을 위한 고급 매칭 및 쓰레기 디렉토리 제외 방법도 다루었습니다. 마지막으로, pathlib에는 없는 .iterdir() 함수를 사용하여 재귀적으로 디렉토리의 파일과 폴더를 나열하는 방법도 소개했습니다.

다양한 방법이 있지만, 상황에 따라 가장 적합한 방법을 선택할 수 있습니다. 특정 상황에서는 조건부 패턴 매칭 또는 재귀적인 나열이 필요할 수 있으며, 다른 상황에서는 단순한 .iterdir() 메소드 방식으로 해결할 수 있습니다. 이러한 도구를 효율적으로 활용하여 파일 작업을 보다 효과적이고 유연하게 수행할 수 있습니다.