이미지 데이터셋을 다루거나 정제된 이미지 폴더의 파일 수를 파악해야 하는 경우가 많습니다.
특히 하위 폴더가 복잡하게 구성된 구조에서는 재귀적으로 전체 폴더를 순회하면서 이미지 파일을 세는 로직이 필요합니다.
Java에서는 이를 직접 재귀함수로 구현해야 하지만, Python은 os.walk() 라는 내장 모듈로 매우 간단하게 처리할 수 있습니다.
이번 글에서는 Python의 os.walk()를 이용해 폴더 내 이미지 파일 수를 집계하는 방법을 소개하고,
Java 방식과 비교해 생산성과 코드 간결성의 차이도 함께 알아보겠습니다.
1. Java에서의 폴더 탐색: 수동 재귀의 한계
Java에서 폴더 내의 파일을 탐색하기 위해서는 일반적으로 다음과 같은 수동 재귀 로직이 필요합니다.
public static int countImages(File dir) {
int count = 0;
File[] files = dir.listFiles();
if (files == null) return 0;
for (File file : files) {
if (file.isDirectory()) {
count += countImages(file); // 재귀 호출
} else if (file.getName().matches("(?i).*\\.(png|jpg|jpeg)$")) {
count++;
}
}
return count;
}
이 방식은 다음과 같은 문제점이 있습니다:
- 예외 처리 및 디렉토리 접근 검증 코드를 별도로 작성해야 함
- 파일 확장자 필터링을 위한 정규식 작성 필요
- 코드 길이가 길고 가독성이 떨어짐
2. Python의 os.walk: 자동 재귀의 강력함
2.1 os.walk란?
os.walk(path)는 지정한 경로부터 시작해 모든 하위 디렉토리를 자동으로 순회하며, 각 폴더 내의 파일과 디렉토리 정보를 튜플 형태로 반환해주는 제너레이터 함수입니다.
for root, dirs, files in os.walk(target_path):
# root: 현재 탐색 중인 폴더 경로
# dirs: 현재 폴더 내의 하위 폴더 목록
# files: 현재 폴더 내의 파일 목록
2.2 이미지 파일 필터링 예시
이미지 파일 확장자를 필터링하려면 files 리스트에 대해 다음과 같은 list comprehension을 사용하면 됩니다:
image_files = [
f for f in files
if f.lower().endswith((".png", ".jpg", ".jpeg"))
]
3. 실전 코드 예시 및 설명
다음은 Python 코드 전체입니다. 이 코드는 정제/ 폴더 하위에 있는 모든 이미지(.png, .jpg, .jpeg) 파일의 개수를 계산하고,
결과를 JSON 파일로 저장합니다.
FastAPI 를 사용하였습니다
@dashboard_router.post("/update-image-count", response_model=ImageCountResponse)
def update_image_count_json():
try:
JSON_PATH = os.path.join(ROOT_DIR, "etc/refinedDataCount.json")
# JSON 로드 또는 초기화
if os.path.exists(JSON_PATH):
with open(JSON_PATH, "r", encoding="utf-8") as f:
data_count = json.load(f)
else:
data_count = {}
# 탐색할 루트 경로 설정
refined_root = os.path.join(ROOT_DIR, "정제")
image_count = 0
# os.walk를 통한 자동 재귀 탐색
for root, dirs, files in os.walk(refined_root):
image_count += len([
f for f in files
if f.lower().endswith((".png", ".jpg", ".jpeg"))
])
# 결과 저장
data_count["total_png"] = image_count
os.makedirs(os.path.dirname(JSON_PATH), exist_ok=True)
with open(JSON_PATH, "w", encoding="utf-8") as f:
json.dump(data_count, f, ensure_ascii=False, indent=4)
print(f"✅ 총 이미지 개수: {image_count} → {JSON_PATH} 저장됨")
return {"success": True, "message": "이미지 개수 업데이트 완료", "image_count": image_count}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
4. 핵심 포인트 정리
항목 | JAVA | Python |
재귀 구현 | 직접 구현 필요 | 내장 함수로 자동 수행 |
코드 길이 | 길고 복잡함 | 간결하고 직관적 |
예외 처리 | 수동 처리 | try-except로 간단 처리 |
유지보수성 | 낮음 | 높음 |
Python은 반복적이고 재귀적인 작업을 매우 간단하게 처리할 수 있도록 다양한 내장 기능을 제공합니다. os.walk는 그 대표적인 예시로, 파일 시스템을 다루는 모든 작업에 강력한 도구가 됩니다.
5. 마무리
Python의 os.walk()는 재귀적으로 파일 시스템을 탐색할 수 있는 매우 강력하고도 간단한 도구입니다. Java와 같은 언어에서는 재귀 구조를 직접 설계해야 하는 반면, Python은 이러한 반복 작업을 몇 줄의 코드로 깔끔하게 처리할 수 있습니다.
이미지 파일 개수 집계, 대용량 폴더 분석, 정제 데이터 자동화 등에 활용하면 실무에서 효율적으로 사용할 수 있습니다.
지금 바로 여러분의 프로젝트에 적용해보세요!
📌 도움이 되셨다면 댓글이나 공감 부탁드립니다
궁금한 점이 있다면 언제든지 질문해주세요!
'BackEnd > Python' 카테고리의 다른 글
[ Python ] PHP에서 Python으로 매개변수(파라미터, 데이터) 전달하는 방법, from php to python parameter (0) | 2022.02.14 |
---|---|
[ Python ] PHP에서 Python 파일 호출하기 (0) | 2022.02.14 |