HOWTO · Python
Python에서 디렉토리의 파일 수 계산
이 튜토리얼은 Python에서 디렉토리의 파일 수를 계산하는 방법을 보여줍니다.
이 페이지의 내용
지정한 디렉터리의 파일 항목 수를 세려면 항목을 순회하면서 각 항목에 Path.is_file()을 적용합니다. 이 검사는 심볼릭 링크를 따라가므로, 대상이 파일이면 파일을 가리키는 심볼릭 링크도 항목 수에 포함됩니다. 아래 예제에서는 디렉터리 바로 아래 항목만 세는 경우와 재귀적으로 탐색하는 경우, 패턴으로 선택하는 경우를 구분합니다. 상대 경로는 Python의 현재 작업 디렉터리를 기준으로 해석되므로, 위치가 중요하다면 절대 경로를 사용하거나 작업 디렉터리를 명시적으로 설정하세요.
pathlib로 디렉터리 하나의 파일 세기
Path.iterdir()은 디렉터리 바로 아래에 있는 항목을 반환합니다. 이를 Path.is_file()과 함께 사용하면 하위 디렉터리는 제외하면서 대상이 파일인 항목을 셀 수 있으며, 파일을 가리키는 심볼릭 링크도 포함됩니다. 예제는 작은 디렉터리 트리를 만듭니다. 최상위 디렉터리에는 파일 두 개와 하위 디렉터리 하나가 있습니다.
이 예제를 실행하세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as temp_dir:
directory = Path(temp_dir)
(directory / "alpha.txt").write_text("A", encoding="utf-8")
(directory / "beta.csv").write_text("B", encoding="utf-8")
child = directory / "nested"
child.mkdir()
(child / "gamma.txt").write_text("C", encoding="utf-8")
count = sum(1 for entry in directory.iterdir() if entry.is_file())
print(f"Number of files: {count}")
Number of files: 2
iterdir()은 바로 아래 항목만 살펴보고 is_file()은 nested 디렉터리를 제외하므로 개수는 2입니다. directory를 확인하려는 경로로 바꾸세요. 디렉터리 하나만 대상으로 하고 읽기 쉬운 경로 연산을 원할 때 좋은 기본 방법입니다.
os.listdir()로 디렉터리 하나의 파일 세기
os.listdir(directory_path)는 지정한 디렉터리의 바로 아래 항목 이름을 모두 반환하며, 디렉터리 이름도 포함합니다. directory_path가 문자열이든 다른 경로 유사 객체든 항목 이름을 반환합니다. 각 이름을 디렉터리 경로와 결합해 경로를 만든 다음, os.path.isfile()로 대상이 파일인지 확인하세요. 이 방법도 파일을 가리키는 심볼릭 링크를 셉니다.
sum(1 for name in os.listdir(directory_path) if os.path.isfile(os.path.join(directory_path, name)))
이 방식은 재귀적으로 탐색하지 않습니다. directory_path를 생략하면 os.listdir()은 현재 작업 디렉터리의 항목을 나열합니다. 프로그램을 실행한 위치에 영향을 받지 않게 하려면 경로를 명시적으로 전달하세요. 항목 이름을 다른 처리에도 사용해야 할 때 유용합니다.
os.scandir()로 파일을 효율적으로 세기
os.scandir(directory_path)는 os.DirEntry 객체의 반복자를 반환합니다. 각 항목에서 is_file()을 호출해 유형을 확인할 수 있으며, 기본적으로 심볼릭 링크를 따라갑니다. 따라서 파일을 가리키는 심볼릭 링크를 포함해 대상이 파일인 항목을 셉니다. 다음과 같이 개수를 구할 수 있습니다.
sum(1 for entry in os.scandir(directory_path) if entry.is_file())
이 반복자는 하위 디렉터리가 아니라 바로 아래 항목을 대상으로 합니다. 항목을 직접 순회할 때는 with os.scandir(directory_path) as entries:를 사용하면 디렉터리 반복자가 제때 닫힙니다. 디렉터리가 크거나 여러 항목 속성이 필요하다면 scandir()이 유용할 수 있습니다. 실제 성능은 파일 시스템과 작업 부하에 따라 달라지므로, 속도 차이를 전제로 하기 전에 직접 측정하세요.
os.walk()로 파일을 재귀적으로 세기
디렉터리와 그 하위 디렉터리의 파일 항목까지 세려면 os.walk(directory_path)를 사용하세요. 방문하는 각 디렉터리마다 현재 경로, 하위 디렉터리 이름, 파일 이름을 반환합니다. files 목록에는 대상이 파일인 심볼릭 링크의 이름도 포함될 수 있으므로, 목록 길이를 더하면 그 항목들도 셉니다. 각 files 목록의 길이를 합산하세요.
sum(len(files) for _, _, files in os.walk(directory_path))
앞선 방법과 달리 이 방식은 디렉터리 트리 전체를 셉니다. os.walk()의 파일 목록에는 이름이 들어가며, 일반적으로 하위 디렉터리는 제외됩니다. 링크를 어떻게 처리할지 또는 탐색 중 디렉터리가 바뀔 수 있는지가 중요하다면 애플리케이션에 맞는 처리 방식을 정하세요. 시작 디렉터리가 없으면 기본적으로 반환되는 행이 없으므로 합계는 0입니다.
glob.glob()로 조건에 맞는 파일 세기
glob.glob()은 패턴으로 경로를 선택합니다. 예를 들어 glob.glob(os.path.join(directory_path, "*.txt"))는 지정한 디렉터리 바로 아래에서 이름이 .txt로 끝나는 항목을 찾습니다. 이 패턴은 하위 디렉터리를 재귀적으로 탐색하지 않습니다. 중첩된 위치까지 찾으려면 **/*.txt 같은 재귀 패턴과 recursive=True를 함께 사용하세요.
패턴과 이름이 일치하는 디렉터리도 결과에 포함될 수 있습니다. 반환된 경로에 os.path.isfile()을 적용해 파일을 가리키는 심볼릭 링크를 포함하여 대상이 파일인 항목만 세세요.
sum(1 for path in glob.glob(os.path.join(directory_path, "*.txt")) if os.path.isfile(path))
간단히 바로 아래 항목을 세려면 pathlib, 항목 이름이 필요하면 listdir(), 항목 객체가 필요하면 scandir(), 디렉터리 트리 전체를 세려면 os.walk(), 파일 이름 패턴으로 셀 대상을 정하려면 glob.glob()을 선택하세요.