WjExplor Story

[점프투파이썬] 06-6 하위 디렉터리 검색하기 본문

Python/Python : Code Study

[점프투파이썬] 06-6 하위 디렉터리 검색하기

더블유제이플로어 2025. 9. 20. 01:15
import os


def search(dirname):
    try:
        filenames = os.listdir(dirname)
        for filename in filenames:
            full_filename = os.path.join(dirname, filename)
            if os.path.isdir(full_filename):
                search(full_filename)
            else:
                ext = os.path.splitext(full_filename)[-1]
                if ext == ".py":
                    print(full_filename)
    except PermissionError:
        pass
search("C:\\python")
import os

for path, dir, files in os.walk("C:\\python"):
    for filename in files:
        ext = os.path.splitext(filename)[-1]
        if ext == ".py":
            print("%s\\%s" % (path, filename))

출처 : https://www.youtube.com/watch?v=VJlIb6EjECc&list=PLU9-uwewPMe05-khW3YcDEaHMk_qA-7lI&index=8

# =================================================================
#
#      sub_dir_search.py 코드 분석 및 파이썬 학습 노트
#
# =================================================================

# 작성하신 코드를 바탕으로, 하위 디렉터리를 검색하는 방법에 대해 더 깊이 알아보고
# 최신 파이썬 트렌드에 맞는 내용까지 함께 정리해 보았습니다.

# -----------------------------------------------------------------
# 1. 작성하신 코드 이해하기: os.walk
# -----------------------------------------------------------------

현재 사용하고 계신 `os.walk`는 특정 디렉터리부터 시작해서 그 아래의 모든 하위 디렉터리까지
순회하며 파일과 폴더 목록을 만들어주는 아주 유용한 함수입니다.

for path, dir, files in os.walk("C:\\python"):
    ...


위 코드는 "C:\python" 디렉터리부터 시작해서, 모든 폴더를 하나씩 방문합니다.
그리고 각 폴더마다 3가지 정보를 반환해 줍니다.

  • `path`: 현재 방문하고 있는 폴더의 경로
  • `dir`: 현재 폴더(`path`) 안에 있는 하위 폴더들의 목록
  • `files`: 현재 폴더(`path`) 안에 있는 파일들의 목록


 따라서 2중 for 문을 사용해서, 각 폴더의 파일(`files`) 목록을 하나씩 확인하고,
 `os.path.splitext()`로 확장자를 분리하여 `.py` 파일인지를 검사하는 원리입니다.

 # 작은 개선점
 원래 코드의 `print("%s\\%s" % (path, filename))` 부분은 Windows 환경에서는 잘 동작하지만,
 리눅스나 macOS에서는 경로 구분자가 `\`가 아닌 `/`이므로 오류가 발생할 수 있습니다.
 어떤 운영체제에서든 문제없이 동작하는 코드를 위해 `os.path.join()`을 사용하신 것은 아주 좋은 습관입니다.
 (위 코드에서는 이미 `os.path.join`을 사용하도록 수정했습니다.)

# -----------------------------------------------------------------
# 2. 더 현대적인 파이썬: `pathlib` 모듈 (Python 3.4+ 추천)
# -----------------------------------------------------------------

 `os` 모듈도 훌륭하지만, Python 3.4 버전부터는 파일 시스템 경로를 '객체'로 다루는
 `pathlib` 모듈이 표준 라이브러리로 추가되었습니다. 훨씬 직관적이고 세련된 코드를 작성할 수 있습니다.

from pathlib import Path

# 검색 시작할 경로를 Path 객체로 만들기
start_path = Path("C:\\python")

# rglob 을 사용해 모든 .py 파일을 재귀적으로 찾기
for py_file in start_path.rglob("*.py"):
    print(py_file)

 

`pathlib`의 장점

  •  **직관적인 코드**: `os.walk`처럼 3개의 변수를 받아서 처리하는 대신, `rglob("*.py")`라는 간단한 명령 하나로 "모든 하위 폴더를 뒤져서(`r`ecursive `glob`) `.py`로 끝나는 파일을 찾아줘" 라는 의미가 명확히 전달됩니다.
  • **객체 지향**: 경로가 단순한 문자열(string)이 아니라, 다양한 기능(메서드)을 가진 `Path` 객체이므로 확장자를 얻거나, 파일명을 얻는 등의 작업을 훨씬 쉽게 할 수 있습니다.
  • **운영체제 독립성**: `os.path.join`을 신경 쓸 필요 없이, 경로를 알아서 해당 운영체제에 맞게 처리해 줍니다.

# -----------------------------------------------------------------
# 3. 핵심 정리 및 추가 학습
# -----------------------------------------------------------------

### `os.walk` vs. `pathlib`
 - **`os.walk`**: 특정 폴더를 순회하면서, 파일과 폴더에 대해 복잡하고 세밀한 작업을 해야 할 때 여전히 강력하고 유용합니다.
 - **`pathlib`**: 단순히 특정 패턴의 파일을 찾거나, 경로를 다루는 일반적인 작업에는 `pathlib`이 훨씬 간결하고 현대적인 방법입니다.

**새로운 코드를 작성하신다면 `pathlib` 사용을 적극 권장합니다.**

### 제너레이터(Generator)
 `os.walk`와 `pathlib.rglob`은 모두 '제너레이터' 방식으로 동작합니다.
 이는 수만 개의 파일이 있더라도, 모든 파일 목록을 메모리에 한 번에 올리는 것이 아니라,
 파일을 하나씩 찾을 때마다 순서대로 반환해주는 방식입니다. 덕분에 메모리를 매우 효율적으로 사용할 수 있습니다.

 이 내용들이 파이썬을 공부하고 블로그에 기록하는 데 도움이 되셨으면 좋겠습니다!

출처 : Gemini