Appia의 IT세상

파이썬 특정 폴더 파일 목록 추출: pathlib·glob·os 비교 + CSV 저장 본문

Python/Python 응용

파이썬 특정 폴더 파일 목록 추출: pathlib·glob·os 비교 + CSV 저장

Appia 2026. 1. 8. 00:30
반응형

파이썬 특정 폴더 파일 목록 추출: pathlib·glob·os 비교 + CSV 저장

파이썬 특정 폴더 파일 목록 추출: pathlib·glob·os 비교 + CSV 저장

 

특정 경로에 파일 목록을 가져오는 작업은 배포, 로그 수집, 데이터 전처리 및 배포 자동화에서 많이 사용됩니다. 하지만, 막상 이 부분에 대해서 구현하려고 하면 어디서부터 해야하는 지에 대해서 고민하게 됩니다. 그래서 이번 포스팅에서는 pathlib, glob, os모듈을 통해서 특정 폴더 경로를 구현하는 방법에 대해서 다루어 보겠습니다. 그리고 현업에서 바로 사용할 수 있는 csv파일로 저장하는 형태 부분 또한 다루어 보겠습니다.

 

TL;DR

  • pathlib(추천): Path.iterdir() / Path.rglob() / is_file()로 파일을 안전하게 구분하면서(폴더 제외) 현재·하위 폴더까지 쉽게 수집
  • glob: "*.csv" 같은 패턴 기반 검색에 간단하고 빠름
  • os: 기존 코드 호환(레거시) 또는 os.walk()처럼 순회 과정 제어가 필요할 때 유용
  • CSV 저장: 표준 라이브러리 csv만으로 충분

1. pathlib (추천)

1.1. 현재 폴더의 파일만 출력

먼저, pathlib을 가장 추천하는 방식이라, 먼저 이야기 해보겠습니다. 특정 폴더를 정하고 그 폴더의 파일만 출력하는 예시를 작성해봤습니다.

from pathlib import Path

base = Path(r"D:\workspace\pyAutoRelease")

for p in base.iterdir():
    if p.is_file():
        print(p.name)

 

위의 코드를 실행해보겠습니다. 

그림 1. 현재 폴더의 파일만 출력 예시

 

위에서 실제 생성한 폴더에 해당하는 파일들이 출력되는 것을 알 수 있습니다. 

 

1.2. 확장자 필터: glob("*.py")

위의 예시에서 약간의 변형을 주고자 합니다. 1.1 챕터에서 다루는 예제에서 특정 확장자만 되어 있는 파일만 출력하고 싶습니다. 

이럴 때 glob을 이용하여 하기와 같이 예시 코드를 구성할 수 있습니다. 

from pathlib import Path

base = Path(r"D:\workspace\pyAutoRelease")

for p in base.glob("*.py"):
    if p.is_file():
        print(p.name)

#결과 : 그림1의 폴더 참조
#main.py
#Test.py

 

위에서 실행하면 py확장자를 가진 파일들만 출력이 됩니다. 

 

1.3. 하위 폴더 포함 재귀 탐색: rglob("*")

그러면 하위 폴더의 파일까지 출력해주는 예시를 작성해보겠습니다. 

from pathlib import Path

base = Path(r"D:\workspace\pyAutoRelease")

for p in base.rglob("*"):
    if p.is_file():
        print(p) #p 전체 경로 / p.name 파일명만

 

그러면 위의 코드를 실행하면 앞서서 1.1.에서 실행한 예제와 달리 경로까지 모두 출력이 됩니다. 

그림 2. 하위 폴더 포함 재귀 탐색: rglob("*") 예시 결과

 

여기에 확장자 필터를 하고 싶다면 다음과 같은 부분을 변경해 주면 됩니다. 

for p in base.rglob("*.py"): #py 부분의 확장자만 출력하기

 

위의 부분을 변경해서 수정하여 진행했다면 다음과 같은 결과가 나오는 것을 알 수 있습니다. 

그림 2. 하위 폴더 포함 재귀 탐색: rglob("*.py") 확장자 필터링 적용 예시

rglob("*")는 파일/폴더가 다 나오니, is_file() 필터를 사용하는 것을 권장합니다. 한가지 단점으로 대규모 폴더일 경우에 다소 느릴 수 있습니다. 

 

1.4. 정렬하여 출력하기 : 이름순 / 수정시간 순

앞선 과정에서 하위 경로까지 진행을 해봤습니다. 그럼 정렬하여 출력하는 방법에 대해서 이야기를 해보겠습니다. 이 부분에 대해서 이름 순/수정시간 순으로 정렬할 수 있는데, 그 방법에 대해서 예시로 작성해보겠습니다. 

from pathlib import Path

base = Path(r"D:\workspace\pyAutoRelease")

files = [p for p in base.iterdir() if p.is_file()]

# 이름순
for p in sorted(files, key=lambda x: x.name.lower()):
    print(p.name)

# 수정시간 최신순
for p in sorted(files, key=lambda x: x.stat().st_mtime, reverse=True):
    print(p.name)

물론 하위 폴더 까지 할 경우에 iterdir() 부분을 rglob("*")로 변경해주시면 됩니다. 단, 이럴 경우에 하위 폴더의 모든 파일까지 이름을 비교하여 출력해줍니다. 이 부분에 대해서 폴더 단위로 정렬해서 출력하는 부분에 대해서 다음 포스팅에서 오늘 포스팅 한 부분의 고급 응용하는 방법에 대해서 별도로 포스팅을 할 예정입니다. 

 

2. glob 모듈

2.1. 현재 폴더에서 패턴 검색

glob는 문자열 경로 기반으로 동작합니다. 따라서, 특정 패턴의 파일만 뽑기에는 매우 간단합니다. 그러면 다음 예시를 살펴보겠습니다. 

import glob

base = r"D:\workspace\pyAutoRelease"
paths = glob.glob(base + r"\*.py")

for p in paths:
    print(p)
    
    
"""
결과
D:\workspace\pyAutoRelease\main.py
D:\workspace\pyAutoRelease\Test.py
"""

 

 

2.2. 하위 폴더까지 재귀

그러면 하위 폴더까지 재귀로 파일을 추출해보겠습니다. 

import glob

base = r"D:\workspace\pyAutoRelease"
paths = glob.glob(base + r"\**\*.py", recursive=True)

for p in paths:
    print(p)
    
"""
결과 
D:\workspace\pyAutoRelease\main.py
D:\workspace\pyAutoRelease\Test.py
D:\workspace\pyAutoRelease\config\auth_git.py
D:\workspace\pyAutoRelease\config\load_config.py
D:\workspace\pyAutoRelease\config\__init__.py
D:\workspace\pyAutoRelease\core\deployer.py
D:\workspace\pyAutoRelease\core\sync_repo.py
D:\workspace\pyAutoRelease\core\__init__.py
D:\workspace\pyAutoRelease\util\build_file_list.py
D:\workspace\pyAutoRelease\util\log.py
D:\workspace\pyAutoRelease\util\util_basic.py
D:\workspace\pyAutoRelease\util\__init__.py
"""

 

한가지 glob을 사용할 경우에 주의 할점이 바로, 폴더인지 아니면 파일인지에 대해서 확인이 필요로 한 것입니다. string 형태로 반환이 되기 때문에, 확인하는 절차를 코드상에 입력하다면 다소 코드가 복잡해질 수 있습니다. 

 

3. os / os.path 모듈

os.listdir()은 오래전부터 사용해오던 방식입니다. 저의 포스팅에서도 os.walk부분은 다룬적이 있습니다. 다만 pathlib에 비해서 경로처리가 문자열 중심이라 약간의 실수들이 발생할 수 있습니다. 

3.1. 현재 폴더의 파일만 출력 (os.listdir + os.path.isfile)

현재 폴더의 있는 파일만 출력하는 예제를 작성해보겠습니다. 

import os

base = r"D:\workspace\pyAutoRelease"

for name in os.listdir(base):
    full = os.path.join(base, name)
    if os.path.isfile(full):
        print(name)

 

 pathlib의 예제보다 다소 코드가 복잡함을 알 수 있습니다. 하지만, 레거시 코드/기존 os.path 코드베이스에서는 os 방식이 자연스럽습니다. 

 

 3.2. 하위 폴더까지 탐색 (os.walk)

다음과 같은 예시로 작성을 하면 하위 폴더의 있는 파일들까지 추출이 가능합니다. 

import os

base = r"D:\workspace\pyAutoRelease"

for root, dirs, files in os.walk(base):
    for name in files:
        print(os.path.join(root, name))

 

 

4. 실무 체크 포인트 (파일/폴더구분 체크)

가끔 exists()가 True여도 실제로는 파일이 아니라 폴더인 경우가 있습니다. 
예: config.json이라는 이름의 폴더가 존재하는 상황

이런 경우 파일을 열려고 했는데 실패 같은 문제가 발생할 수 있으니, 열기/읽기 전에는 is_file()(또는 os.path.isfile)로 확인하는 게 안전합니다.

from pathlib import Path

p = Path("config.json")

if p.exists() and p.is_file():
    print("파일이 존재합니다.")
elif p.exists() and p.is_dir():
    print("주의: 같은 이름의 '폴더'가 존재합니다.")
else:
    print("존재하지 않습니다.")

 

5. pathlib·glob·os비교 

위에서 각 모듈을 사용해서 파일을 추출하는 방법에 대해서 살펴봤습니다. 이번에는 pathlib, glob와 os 모듈을 각각 비교해보겠습니다. 

구분 pathlib glob os
기본 추천도 가장 추천 패턴만 필요할 때 레거시/저수준 제어
반환 타입 Path 객체 str 경로 str 경로
현재 폴더 파일 iterdir() glob("*.ext") listdir()+isfile
재귀 탐색 rglob() "**" + recursive os.walk
파일/폴더 판별 is_file()/is_dir() 별도 판별 필요 os.path.isfile/isdir
가독성/확장성 좋음 보통 보통~낮음

 

6. CSV 추출 하기 

그러면 pathlib을 활용하여 csv추출하는 간단한 예시를 살펴보겠습니다. 

from pathlib import Path
import csv

base = Path(r"D:\workspace\pyAutoRelease")
files = [p for p in base.rglob("*") if p.is_file()]

out = Path("files.csv")
with out.open("w", newline="", encoding="utf-8-sig") as f:
    w = csv.writer(f)
    w.writerow(["path", "name", "size_bytes"])
    for p in files:
        w.writerow([str(p), p.name, p.stat().st_size])

위의 코드를 수행하고 나서, 생성된 csv 파일을 보면 다음과 같음을 알 수 있습니다. 스크립트 실행 위치에 생성됩니다. (원하면 out 경로 지정 가능)

그림 3. csv 파일 생성 예제 결과

 

이번 포스팅에서는 파이썬으로 특정 폴더(하위 폴더 포함)의 파일 목록을 추출하는 방법을 pathlib, glob, os 관점에서 비교해봤습니다. 정리하면, 대부분의 자동화/스크립트 작업에서는 pathlib가 가장 읽기 쉽고 확장하기도 편해 기본 선택으로 추천합니다. 패턴 매칭만 빠르게 필요하면 glob도 충분히 간단하고, 기존 코드 호환이나 순회 제어가 필요할 때는 os.walk가 여전히 유용합니다.

또한 파일 목록을 실제로 활용하려면 결과를 저장하는 경우가 많기 때문에, 마지막에는 표준 라이브러리 csv로 간단히 CSV 파일로 내보내는 예제도 함께 정리했습니다. 다음 글에서는 CSV를 조금 더 실무적으로 다루는 방법(인코딩/대용량 처리/컬럼 구성)과 함께, 엑셀(xlsx)로 저장하는 방법까지 확장해서 정리해보겠습니다.

 

 

파이썬 파일·디렉터리 유무 확인 방법: os.path vs pathlib, 예외 처리까지

파이썬 파일·디렉터리 유무 확인 방법: os.path vs pathlib, 예외 처리까지 최종 업데이트: 2026-01-06 파이썬에서 파일/디렉터리 존재 여부를 확인하는 방법을 pathlib 중심으로 정리하겠습니다. exists/is_f

appia.tistory.com

 

반응형
Comments