Skip to main content

pathlib - 경로 관리

학습 목표

  • Path 객체로 경로를 조합하고 분해할 수 있다
  • glob 패턴으로 파일을 검색할 수 있다
  • 파일/디렉토리의 존재 여부와 속성을 확인할 수 있다
  • 실무에서의 경로 관리 패턴을 적용할 수 있다

왜 중요한가

파일 경로 관리는 ML/DL 프로젝트에서 매우 빈번합니다. 데이터셋 경로, 체크포인트 저장 경로, 로그 디렉토리 등을 안전하고 플랫폼 독립적으로 관리해야 합니다. pathlib은 문자열 조합 대신 객체지향적인 경로 처리를 제공합니다.

Path 객체 기본

1

경로 생성과 조합

from pathlib import Path

# 경로 생성
p = Path("data/train")
home = Path.home()
cwd = Path.cwd()

# / 연산자로 경로 조합 (OS 독립적)
data_dir = Path("project") / "data" / "images"
print(data_dir)  # project/data/images (macOS/Linux)
                 # project\data\images (Windows)

# 절대 경로 변환
abs_path = data_dir.resolve()
print(abs_path)  # /Users/user/project/data/images
2

경로 분해

p = Path("/home/user/project/model_v2.pt")

print(p.name)     # "model_v2.pt"   (파일명)
print(p.stem)     # "model_v2"      (확장자 제외)
print(p.suffix)   # ".pt"           (확장자)
print(p.parent)   # /home/user/project (상위 디렉토리)
print(p.parts)    # ('/', 'home', 'user', 'project', 'model_v2.pt')

# 확장자 변경
new_p = p.with_suffix(".onnx")
print(new_p)  # /home/user/project/model_v2.onnx

# 파일명 변경
new_p = p.with_name("model_v3.pt")
print(new_p)  # /home/user/project/model_v3.pt
3

파일/디렉토리 확인

p = Path("data.csv")

print(p.exists())    # True/False
print(p.is_file())   # True/False
print(p.is_dir())    # True/False

# 파일 크기
if p.exists():
    size = p.stat().st_size
    print(f"파일 크기: {size:,} bytes")

glob 패턴으로 파일 검색

from pathlib import Path

project = Path("ml_project")

# 특정 확장자 검색
py_files = list(project.glob("*.py"))         # 현재 디렉토리만
all_py = list(project.glob("**/*.py"))        # 재귀적 검색
csv_files = list(project.glob("data/**/*.csv"))

# 패턴 매칭
checkpoints = list(project.glob("checkpoints/model_*.pt"))
logs = list(project.glob("logs/????-??-??.log"))  # ? = 단일 문자

# rglob (recursive glob의 축약)
all_images = list(project.rglob("*.png"))  # **/*.png와 동일

for f in sorted(all_py):
    print(f"  {f}")

파일/디렉토리 조작

from pathlib import Path

# 디렉토리 생성
output_dir = Path("outputs/experiment_001")
output_dir.mkdir(parents=True, exist_ok=True)

# 파일 읽기/쓰기 (간편 메서드)
p = Path("note.txt")
p.write_text("Hello, pathlib!", encoding="utf-8")
content = p.read_text(encoding="utf-8")
print(content)  # "Hello, pathlib!"

# 파일 이동/이름 변경
p.rename("renamed.txt")

# 파일 삭제
Path("renamed.txt").unlink(missing_ok=True)

# 디렉토리 내용 나열
for item in Path(".").iterdir():
    kind = "DIR" if item.is_dir() else "FILE"
    print(f"[{kind}] {item.name}")

AI/ML에서의 활용

from pathlib import Path
from datetime import datetime

# 실험 디렉토리 관리
def create_experiment_dir(base_dir="experiments"):
    """타임스탬프 기반 실험 디렉토리를 생성합니다."""
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    exp_dir = Path(base_dir) / timestamp

    # 하위 디렉토리 생성
    (exp_dir / "checkpoints").mkdir(parents=True)
    (exp_dir / "logs").mkdir(parents=True)
    (exp_dir / "outputs").mkdir(parents=True)

    return exp_dir

exp_dir = create_experiment_dir()
print(f"실험 디렉토리: {exp_dir}")

# 체크포인트 관리
def find_latest_checkpoint(checkpoint_dir):
    """가장 최근 체크포인트를 찾습니다."""
    checkpoints = sorted(
        Path(checkpoint_dir).glob("checkpoint_*.pt"),
        key=lambda p: p.stat().st_mtime,
        reverse=True
    )
    return checkpoints[0] if checkpoints else None

latest = find_latest_checkpoint("checkpoints")
if latest:
    print(f"최근 체크포인트: {latest}")

# 데이터셋 파일 목록 생성
def collect_image_paths(data_dir):
    """이미지 파일 경로를 수집합니다."""
    extensions = {".jpg", ".jpeg", ".png", ".bmp"}
    data_path = Path(data_dir)

    images = [
        p for p in data_path.rglob("*")
        if p.suffix.lower() in extensions
    ]
    return sorted(images)
새 코드에서는 pathlib을 권장합니다. 객체지향적이고, 메서드 체이닝이 가능하며, / 연산자로 경로를 직관적으로 조합할 수 있습니다. 기존 코드와의 호환을 위해 str(path)로 문자열 변환이 가능합니다.

체크리스트

  • Path 객체로 경로를 생성하고 조합할 수 있다
  • glob/rglob으로 파일을 검색할 수 있다
  • mkdir, write_text, read_text 등 편의 메서드를 활용할 수 있다
  • ML 프로젝트의 디렉토리 구조를 pathlib으로 관리할 수 있다

다음 문서