# 파일 시스템 & OS 환경 마스터: pathlib vs os > **시리즈 02 – 파이썬으로 폴더와 파일을 자유자재로 다루기** 프로그램을 만들다 보면 파일을 생성하고, 폴더를 옮기고, 경로를 확인하는 작업이 반드시 필요합니다. 이때 파이썬에는 두 개의 “정답”이 있습니다. 경로를 우아하게 다루는 **`pathlib`**, 그리고 파이썬 프로그램이 실행되는 **운영체제(OS) 환경 자체를 제어하는 `os`**입니다. ![기계와 디지털의 만남](/media/editor_temp/6/dde8bc58-b467-4fe2-9370-24899d41a7bd.png) `pathlib`이 경로 조작의 스타라면, `os`는 무대 뒤에서 조명·음향·출입문까지 관리하는 **현장 총괄**에 가깝습니다. 둘 중 하나를 버리기보다, **역할에 맞게 함께 쓰는 것**이 가장 깔끔합니다. --- ## 1. os와 pathlib, 무엇이 다른가? {#sec-92641994f71a} Python 3.4부터 `pathlib`이 도입되며 경로 처리 방식이 크게 좋아졌습니다. * **`os` / `os.path`** * 경로를 기본적으로 **문자열**로 다룹니다. * 함수형 스타일이라 조합이 길어지면 `os.path.join()`, `basename()`, `splitext()` 같은 호출이 많아집니다. * 대신 “경로”를 넘어 **OS 기능(환경 변수, 프로세스, 권한 등)**까지 다룹니다. * **`pathlib`** * 경로를 **객체(Path)** 로 다룹니다. * `/` 연산자 조합, 메서드 체이닝 덕분에 코드가 짧고 직관적입니다. * 파일/디렉터리 탐색, 확장자 처리 등 “경로 작업”은 확실히 `pathlib` 쪽이 편합니다. --- ## 2. 필수 작업별 코드 비교 {#sec-273fe3d2efe4} ### 2.1 현재 작업 디렉터리 확인 및 폴더 생성 {#sec-707744fc63d4} ```python 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 경로 합치기 (차이가 가장 크게 체감되는 부분) {#sec-55f0047ba895} ```python 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을 권장하는 이유: “경로 객체”의 힘 {#sec-a7e299456c6e} `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. 실전 예제: 특정 확장자 파일만 모두 찾기 {#sec-1313166407f5} 프로젝트 폴더 내에서 `.txt` 파일만 찾아 리스트를 만드는 작업을 해보겠습니다. ```python 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가 진짜 강한 영역이 따로 있다: “운영체제 환경” 제어 {#sec-42d7841b5743} 여기서부터가 균형의 핵심입니다. **`pathlib`은 경로 전문가**지만, **OS 자체를 만지는 일은 `os`의 무대**입니다. ### 5.1 환경 변수 읽기/쓰기 (배포·보안·설정의 핵심) {#sec-bc07d2294385} 개발/운영 환경이 달라질수록 설정은 파일보다 **환경 변수**로 분리하는 경우가 많습니다. ```python 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에게 일을 시키는” 기능 {#sec-be8e97bf9b7c} 외부 명령을 실행하거나 프로세스를 다루는 작업은 결국 OS 기능입니다. `os`는 저수준 인터페이스를 제공하기 때문에, 사실 os 에게 명령을 하는 것에 특화 된 `subprocess` 가 더 자주 쓰이긴 합니다.(그래도 출발점이 OS 제어라는 점은 동일합니다). ```python import os # 간단 실행(반환값은 종료 코드) exit_code = os.system("echo hello") print(exit_code) ``` 또는 더 세밀한 프로세스 제어(실행/대체/포크 등) 성격의 함수들도 `os` 쪽에 존재합니다. `pathlib`이 다루는 “경로”와 완전히 다른 영역입니다. --- ### 5.3 권한, 사용자, 작업 디렉터리 등 “환경 자체” 다루기 {#sec-3b5ac9f93cf3} * 권한 변경(Unix 계열): `os.chmod()` * 작업 디렉터리 변경: `os.chdir()` * 프로세스/사용자 관련 정보: `os.getpid()` 등 이런 기능들은 `pathlib`이 대체할 수 없습니다. **`pathlib`이 못하는 걸 `os`가 한다**는 말이 진짜인 영역입니다. --- ## 6. 결론: pathlib, os 역할 분담시키자 {#sec-a1f526df17df} * **경로 조작 / 파일 탐색 / 파일명 처리** → `pathlib`이 더 읽기 쉽고 유지보수에 유리합니다. * **환경 변수 / 프로세스 / 권한 / OS 기능 전반** → `os`가 담당하는 고유 영역입니다. 실제로 가장 좋은 패턴은 이겁니다. * “경로는 `Path`로 끝까지 들고 간다” * “OS와 대화해야 하는 순간에는 `os`를 쓴다” --- ## 7. 요약 {#sec-94950e4d35ef} * `pathlib`은 파일 시스템을 다루는 코드의 **가독성과 안정성**을 크게 올려줍니다. * `os`는 경로를 넘어, 파이썬 프로그램이 놓인 **운영체제 환경 자체를 제어**합니다. * 정답은 “둘 중 하나”가 아니라 **`pathlib + os` 조합**입니다. **한 줄 정리**: 경로/파일 작업은 `pathlib`로 깔끔하게, OS 환경 제어는 `os`로 확실하게. --- **관련글 :** - [[파이썬 표준라이브러리 - 0] 파이썬 표준 라이브러리란? 초심자를 위한 가이드](/ko/whitedec/2026/1/29/python-standard-library/) - [Python 표준라이브러리 정복 3 - pathlib](/ko/whitedec/2025/5/8/python-standard-library-pathlib/)