기존 파이썬 코드에서는 파일 경로를 다룰 때 os.path
모듈을 주로 사용했습니다. 하지만 이 방식은 문자열 기반으로 경로를 처리하므로 플랫폼별 경로 구분자 문제, 문자열 연산 남용, 가독성 저하가 발생할 수 있습니다. Python 3.4+에서 도입된 pathlib
는 경로를 객체(클래스)로 다루며, 연산자 오버로딩을 통해 훨씬 직관적인 파일 경로 조작을 가능하게 합니다.
이번 글에서는 os.path 대비 pathlib의 사용법, 장단점, 예제 코드를 소개합니다.
예전에는 어떻게 했을까?
os.path
방식
경로 결합, 체크, 생성 등 대부분의 작업을 문자열 조작으로 처리해야 했습니다.
import os
base_dir = "/path/to"
filename = "data.txt"
full_path = os.path.join(base_dir, filename)
if os.path.exists(full_path):
with open(full_path, 'r') as f:
content = f.read()
단점:
- 문자열 기반: 경로 연산 시 os.path.join 등 함수 호출 필요
- 여러 번의 함수 호출, 플랫폼별 경로 구분자('\', '/') 관리 필요
- 경로 조작시 코드 가독성 저하
pathlib: 경로를 객체로 다루기
pathlib
는 Path 클래스를 제공하여 경로를 객체로 다룹니다.
from pathlib import Path
base_dir = Path("/path/to")
filename = "data.txt"
full_path = base_dir / filename # 연산자 오버로딩으로 경로 결합!
장점:
- 가독성 향상:
/
연산자로 경로 결합 →base_dir / filename
형태로 직관적 - 플랫폼 독립성: Path 객체가 OS별 경로 구분자를 알아서 처리
- 풍부한 메서드:
full_path.exists()
,full_path.is_dir()
,full_path.mkdir()
,full_path.read_text()
등 Path 객체 메서드로 파일 작업 간결화
예를 들어, 파일 존재 여부 체크 및 읽기:
if full_path.exists():
content = full_path.read_text() # 별도 open/close 없이 바로 텍스트 읽기
파일 쓰기 예:
new_file = base_dir / "output.txt"
new_file.write_text("Hello, pathlib!")
이전 방식 대비 훨씬 단순하며, 운영체제별 경로 이슈나 반복되는 os.path 호출 없이도 작업 가능.
성능 측면
pathlib은 os.path 대비 성능적 이점이 크게 부각되지 않을 수 있으나, 코드 품질과 유지보수 면에서 이점이 큽니다. 또한, 경로 조작 로직이 많을수록 pathlib의 가독성 이점이 커집니다. 성능이 극도로 중요한 경우에는 여전히 os.path나 특정 저수준 API를 고민할 수 있지만, 대부분의 애플리케이션에서는 pathlib로도 충분히 빠르고 직관적인 개발이 가능합니다.
단점
- Python 3.4+에서 지원되므로, 아주 오래된 환경에서는 사용할 수 없음(다만 이제 거의 문제가 되지 않는 경우가 많음)
- 기존 os.path 코드베이스를 pathlib로 전환 시 약간의 리팩토링 필요
전체적으로 pathlib은 현대적이고 Pythonic한 코드 작성을 위한 강력한 도구입니다.
결론
- pathlib은 파일 경로 처리에 있어서 os.path 대비 훨씬 직관적이고 깔끔한 현대적 접근 방식을 제공
- 경로 결합, 파일 IO, 디렉토리 관리 등이 객체 메서드로 간단히 가능
- Python 3.4+ 이상 사용 시 pathlib 도입 권장, 특히 대규모 프로젝트나 멀티플랫폼 지원 시 이점 큼
다음 글에서는 동시성, 병렬 처리를 다룰 때 전통적인 threading, multiprocessing 대신 concurrent.futures
나 asyncio
를 활용해 비동기/병렬 코드를 현대적으로 작성하는 방법을 살펴보겠습니다.
'개발 이야기 > Python (파이썬)' 카테고리의 다른 글
[모던 Python 6편] pyproject.toml와 Poetry로 패키징 현대화하기 (0) | 2024.12.17 |
---|---|
[모던 Python 5편] concurrent.futures, asyncio로 동시성/병렬 코드 간소화하기 (0) | 2024.12.17 |
[모던 Python 3편] dataclass로 데이터 구조 간소화하기 (0) | 2024.12.17 |
[모던 Python 2편] 타입 힌트와 Mypy로 코드 명확성 강화하기 (0) | 2024.12.17 |
[모던 Python 1편] f-string: 문자열 포매팅의 현대적 방식 (0) | 2024.12.17 |