파일 시스템 & OS 환경 마스터: pathlib vs os
시리즈 02 – 파이썬으로 폴더와 파일을 자유자재로 다루기
프로그램을 만들다 보면 파일을 생성하고, 폴더를 옮기고, 경로를 확인하는 작업이 반드시 필요합니다. 이때 파이썬에는 두 개의 “정답”이 있습니다.
경로를 우아하게 다루는 pathlib, 그리고 파이썬 프로그램이 실행되는 운영체제(OS) 환경 자체를 제어하는 os입니다.

pathlib이 경로 조작의 스타라면, os는 무대 뒤에서 조명·음향·출입문까지 관리하는 현장 총괄에 가깝습니다. 둘 중 하나를 버리기보다, 역할에 맞게 함께 쓰는 것이 가장 깔끔합니다.
1. os와 pathlib, 무엇이 다른가?
Python 3.4부터 pathlib이 도입되며 경로 처리 방식이 크게 좋아졌습니다.
-
os/os.path -
경로를 기본적으로 문자열로 다룹니다.
- 함수형 스타일이라 조합이 길어지면
os.path.join(),basename(),splitext()같은 호출이 많아집니다. -
대신 “경로”를 넘어 OS 기능(환경 변수, 프로세스, 권한 등)까지 다룹니다.
-
pathlib -
경로를 객체(Path) 로 다룹니다.
/연산자 조합, 메서드 체이닝 덕분에 코드가 짧고 직관적입니다.- 파일/디렉터리 탐색, 확장자 처리 등 “경로 작업”은 확실히
pathlib쪽이 편합니다.
2. 필수 작업별 코드 비교
2.1 현재 작업 디렉터리 확인 및 폴더 생성
import os
from pathlib import Path
# os 방식
current_os = os.getcwd()
if not os.path.exists("test_os"):
os.makedirs("test_os")
# pathlib 방식
current_pl = Path.cwd()
Path("test_pl").mkdir(exist_ok=True)
팁: “경로”가 눈에 많이 보이는 코드라면 pathlib이 유지보수에 유리합니다.
2.2 경로 합치기 (차이가 가장 크게 체감되는 부분)
import os
from pathlib import Path
# os 방식
path_os = os.path.join("usr", "bin", "python")
# pathlib 방식 (슬래시 연산자)
path_pl = Path("usr") / "bin" / "python"
경로 조합이 많아질수록 pathlib 쪽이 읽기 쉬워집니다.
3. pathlib을 권장하는 이유: “경로 객체”의 힘
pathlib의 장점은 “합치기”에서 끝나지 않습니다. 파일 정보를 꺼내는 순간 차이가 더 커집니다.
| 기능 | os.path 방식 |
pathlib 방식 |
|---|---|---|
| 파일명 추출 | os.path.basename(p) |
p.name |
| 확장자 제외 이름 | os.path.splitext(os.path.basename(p))[0] |
p.stem |
| 확장자 확인 | os.path.splitext(p)[1] |
p.suffix |
| 부모 디렉터리 | os.path.dirname(p) |
p.parent |
이런 “자잘한 경로 처리”가 계속 누적되기 때문에, pathlib로 통일하면 팀 코드가 눈에 띄게 단정해집니다.
4. 실전 예제: 특정 확장자 파일만 모두 찾기
프로젝트 폴더 내에서 .txt 파일만 찾아 리스트를 만드는 작업을 해보겠습니다.
from pathlib import Path
base_path = Path.cwd()
txt_files = list(base_path.rglob("*.txt")) # 하위 폴더 포함 재귀 탐색
for file in txt_files:
print(f"파일명: {file.name}, 절대경로: {file.resolve()}")
rglob() 하나로 재귀 탐색이 끝납니다. “파일 찾기” 작업은 pathlib이 정말 강합니다.
5. 그런데 os가 진짜 강한 영역이 따로 있다: “운영체제 환경” 제어
여기서부터가 균형의 핵심입니다.
pathlib은 경로 전문가지만, OS 자체를 만지는 일은 os의 무대입니다.
5.1 환경 변수 읽기/쓰기 (배포·보안·설정의 핵심)
개발/운영 환경이 달라질수록 설정은 파일보다 환경 변수로 분리하는 경우가 많습니다.
import os
# 읽기
db_url = os.environ.get("DATABASE_URL", "sqlite:///local.db")
# 쓰기 (현재 프로세스에만 적용되는 경우가 일반적)
os.environ["APP_ENV"] = "production"
예: API 키, 실행 모드, 로그 레벨, 기능 플래그(feature flag) 등은 pathlib이 아니라 os의 영역입니다.
5.2 프로세스/명령 실행: “OS에게 일을 시키는” 기능
외부 명령을 실행하거나 프로세스를 다루는 작업은 결국 OS 기능입니다.
os는 저수준 인터페이스를 제공하기 때문에, 사실 os 에게 명령을 하는 것에 특화 된 subprocess 가 더 자주 쓰이긴 합니다.(그래도 출발점이 OS 제어라는 점은 동일합니다).
import os
# 간단 실행(반환값은 종료 코드)
exit_code = os.system("echo hello")
print(exit_code)
또는 더 세밀한 프로세스 제어(실행/대체/포크 등) 성격의 함수들도 os 쪽에 존재합니다. pathlib이 다루는 “경로”와 완전히 다른 영역입니다.
5.3 권한, 사용자, 작업 디렉터리 등 “환경 자체” 다루기
- 권한 변경(Unix 계열):
os.chmod() - 작업 디렉터리 변경:
os.chdir() - 프로세스/사용자 관련 정보:
os.getpid()등
이런 기능들은 pathlib이 대체할 수 없습니다. pathlib이 못하는 걸 os가 한다는 말이 진짜인 영역입니다.
6. 결론: pathlib, os 역할 분담시키자
- 경로 조작 / 파일 탐색 / 파일명 처리 →
pathlib이 더 읽기 쉽고 유지보수에 유리합니다. - 환경 변수 / 프로세스 / 권한 / OS 기능 전반 →
os가 담당하는 고유 영역입니다.
실제로 가장 좋은 패턴은 이겁니다.
- “경로는
Path로 끝까지 들고 간다” - “OS와 대화해야 하는 순간에는
os를 쓴다”
7. 요약
pathlib은 파일 시스템을 다루는 코드의 가독성과 안정성을 크게 올려줍니다.os는 경로를 넘어, 파이썬 프로그램이 놓인 운영체제 환경 자체를 제어합니다.- 정답은 “둘 중 하나”가 아니라
pathlib + os조합입니다.
한 줄 정리: 경로/파일 작업은 pathlib로 깔끔하게, OS 환경 제어는 os로 확실하게.
관련글 :
댓글이 없습니다.