pathlib 시작하기 — 객체 지향 경로 다루기

파이썬을 하다 보면 파일 경로나 디렉토리를 다루는 일이 아주 흔하죠. 로그를 저장하거나 설정 파일을 읽고 쓰거나, 데이터 파일을 정리하는 등 일상적인 작업입니다. 이런 작업들, 예전에는 os.pathglob, shutil 같은 모듈을 여기저기 섞어 쓰며 처리했는데요, 이제는 그럴 필요 없습니다. 왜냐고요?

pathlib이 있으니까요.

pathlib은 뭘까?

pathlib은 파이썬 3.4부터 등장한 경로 처리 전용 객체지향 모듈이에요. 기존에는 파일 경로를 단순 문자열로 다뤘다면, pathlib은 "경로 그 자체"를 하나의 객체로 다룹니다. 덕분에 경로를 연결하거나, 존재 여부를 확인하거나, 파일을 읽고 쓰는 작업이 훨씬 더 명확하고 읽기 쉬운 문법으로 바뀌었습니다.

from pathlib import Path

▶ 이 Path 클래스는 자동으로 여러분의 운영체제에 맞춰 PosixPath(macOS/Linux) 또는 WindowsPath로 동작합니다. 여러분이 어떤 OS를 쓰든 신경 쓸 필요 없다는 말이에요!


pathlib의 필수 기능과 예제

1. 경로 객체 생성

p = Path('data/example.txt')
print(p.resolve())  # 절대경로 반환

문자열 같아 보이지만, 이건 객체입니다. 다양한 메서드와 속성을 통해 경로를 유연하게 다룰 수 있습니다.

2. 경로 결합: / 연산자 사용

data_dir = Path('data')
file_path = data_dir / 'sample.txt'

슬래시 연산자 /로 경로를 연결할 수 있다는 점이 매우 Pythonic 합니다. 문자열 덧셈보다 가독성과 안정성이 높습니다.

3. 경로 정보 추출

부모 디렉토리, 이름, 확장자 등 경로 구성요소 분리해낼 수 있는 점도 매우 편리합니다.

p = Path('data/sample.txt')
print(p.parent)   # data
print(p.name)     # sample.txt
print(p.stem)     # sample
print(p.suffix)   # .txt

4. 존재 여부 확인

결과를 불리언으로 반환합니다.

p.exists()     # 존재 여부
p.is_file()    # 파일인지?
p.is_dir()     # 디렉토리인지?

5. 디렉토리 생성

p = Path('logs/2025/05')
p.mkdir(parents=True, exist_ok=True)

중첩 디렉터리까지 한 번에 생성 가능하며, 이미 존재해도 오류 없이 넘어갑니다.

6. 파일 읽고 쓰기

p = Path('output.txt')
p.write_text("Hello, World!")

text = p.read_text()
print(text)

바이너리 파일도 다룰 수 있습니다:

p.write_bytes(b'binary data')
data = p.read_bytes()

7. 파일/디렉토리 검색

print(list(Path('.').glob('*.py')))      # 현재 폴더의 .py 파일 목록
print(list(Path('.').rglob('*.py')))     # 하위 폴더까지 재귀 탐색

glob()은 제너레이터를 반환하므로 리스트로 변환해서 확인하는 방식이 좋습니다.

8. 파일 삭제, 이동, 이름 변경

p.unlink()           # 삭제
p.rename('newname')  # 이름 변경 (같은 디렉토리 내에서)
p.replace('newpath') # 이동 및 덮어쓰기

rename()은 대상 경로가 존재하면 실패할 수 있으므로, 덮어쓰기가 필요한 경우 replace()를 사용하세요. 복사 작업은 shutil.copy()를 사용해야 합니다.


os.path vs pathlib 비교

# os.path
import os
os.path.exists('foo/bar.txt')

# pathlib
Path('foo/bar.txt').exists()
  • 코드가 훨씬 읽기 쉽고, 가독성도 좋습니다.
  • 특히 리눅스 환경에서 자주 쓰는 cd, ls, mkdir과 유사한 문법 구조로 친숙합니다.

왜 pathlib을 써야 할까?

  • 문자열 대신 Path 객체로 구조적인 코드가 됩니다.
  • 운영체제에 독립적인 경로 처리 (Windows vs POSIX)
  • os.path, glob, shutil의 기능을 하나로 통합
  • 테스트 코드, 로깅, 에러 처리 등에서도 유지보수성 향상

Tux assembling file path blocks in a Python T-shirt

마무리하며

Counter, defaultdict가 컬렉션 다루기를 더 우아하게 만들어줬듯이, pathlib은 파일 경로를 다루는 방식을 완전히 바꿔놓습니다. 문자열 처리로 힘들었던 옛 시절은 이제 잊어도 좋습니다. 이 글에서 보여드린 예제들을 하나씩 직접 실행해 보세요. 생각보다 훨씬 빠르게 손에 익을 거예요.

다음 편에서는 shutil을 통해 실제 파일 복사/백업을 자동화하는 고급 활용법을 다룰 예정입니다. 기대해 주세요!

이전글이 궁금하시면 아래의 링크를 클릭하여 확인할 수 있습니다.

파이썬 표준라이브러리 1 - collections.Counter

파이썬 표준라이브러리 2 - collections.defaultdict