파일 시스템 & 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로 확실하게.


관련글 :