| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 다형성
- 주피터
- 코드잇
- 인프런
- 스택
- 동적바인딩
- 11382번
- 프로그래머스lv2
- 멤버함수로구현
- python
- 람다식
- 점프투파이썬
- OpenCV
- list comprehension
- 코딩테스트
- 백준
- 제네릭프로그래밍
- c++코딩테스트합격자되기
- 참조자
- 기본클래스
- C++
- 연산자오버로딩
- 데이터사이언스
- OOP
- 포인터
- 상속
- 깊은복사
- STL
- 얕은복사
- 유도클래스
- Today
- Total
WjExplor Story
[점프투파이썬] 06-6 하위 디렉터리 검색하기 본문
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
'Python > Python : Code Study' 카테고리의 다른 글
| 파이썬 리스트 컴프리헨션 (List Comprehension) (0) | 2025.09.25 |
|---|---|
| [Microsoft 공식 문서] 초보자를 위한 Python Git 링크 (0) | 2025.09.24 |
| 피보나치 수열에서 4백만 이하이면서 짝수인 항의 합 (0) | 2025.09.19 |
| 코드 포매팅(Code Formatting) 사용하기 (0) | 2025.09.19 |
| [점프 투 파이썬] 6강 파이썬 프로그래밍, 어떻게 시작해야 할까? (0) | 2025.09.19 |