안녕하세요! 지난 시간에는 파이썬 코드를 체계적으로 구성하고 관리하는 모듈(Module)과 패키지(Package)에 대해 알아보았습니다. 이제 여러분은 대규모 프로젝트도 효율적으로 분할하고 관리할 수 있는 기반을 다지게 되었을 거예요!
이번 시간에는 파이썬에서 파일 시스템과 상호작용하는 데 필수적인 두 가지 모듈인 os 모듈과 pathlib 모듈에 대해 알아보겠습니다. 이 모듈들은 파일이나 폴더의 경로를 조작하고, 생성, 삭제, 이름 변경 등 다양한 파일 시스템 작업을 수행할 수 있게 해줍니다.
os 모듈은 전통적인 방식의 함수 기반 접근을 제공하며, pathlib 모듈은 더 현대적이고 객체지향적인 접근 방식을 제공합니다. 마치 파일 시스템을 다루는 두 가지 다른 도구 상자를 배우는 것과 같습니다.
Part 1: os 모듈 - 운영체제와 상호작용
os 모듈은 운영체제(Operating System)와 상호작용하는 다양한 기능을 제공합니다. 파일 시스템 경로 조작, 디렉토리 생성/삭제, 파일 삭제/이름 변경 등 저수준(low-level)의 파일 시스템 작업을 수행할 때 유용합니다.
1. 현재 작업 디렉토리 확인 및 변경
- os.getcwd(): 현재 작업 디렉토리(Current Working Directory)의 경로를 문자열로 반환합니다.
- os.chdir(path): 현재 작업 디렉토리를 지정된 path로 변경합니다.
예시:
# 파일 이름: os_cwd.py
import os
print(f"현재 작업 디렉토리: {os.getcwd()}")
# 새 디렉토리 생성 (없을 경우)
if not os.path.exists("temp_dir"):
os.mkdir("temp_dir")
print("temp_dir 생성.")
# 작업 디렉토리 변경
os.chdir("temp_dir")
print(f"변경된 작업 디렉토리: {os.getcwd()}")
# 다시 원래 디렉토리로 돌아가기
os.chdir("..") # 상위 디렉토리로 이동
print(f"원래 작업 디렉토리로 복귀: {os.getcwd()}")
# 생성했던 temp_dir 삭제 (비어있어야 삭제 가능)
os.rmdir("temp_dir")
print("temp_dir 삭제.")
[VS Code 터미널 출력]

2. 파일 및 디렉토리 목록 확인
- os.listdir(path='.'): 지정된 path 디렉토리 내의 모든 파일과 서브 디렉토리의 이름을 리스트로 반환합니다. path를 생략하면 현재 작업 디렉토리를 대상으로 합니다.
예시:
# 파일 이름: os_listdir.py
import os
# 예시를 위한 파일/폴더 생성
if not os.path.exists("test_dir"):
os.makedirs("test_dir/subdir")
with open("test_dir/file1.txt", "w") as f: f.write("hello")
with open("test_dir/subdir/file2.txt", "w") as f: f.write("world")
print("예시를 위한 test_dir 및 파일 생성.")
print(f"현재 디렉토리 내용: {os.listdir()}")
print(f"test_dir 디렉토리 내용: {os.listdir('test_dir')}")
print(f"test_dir/subdir 디렉토리 내용: {os.listdir('test_dir/subdir')}")
# 생성했던 test_dir 삭제 (비어있지 않으면 삭제 불가)
# os.rmdir("test_dir") # 오류 발생
# os.remove("test_dir/file1.txt")
# os.remove("test_dir/subdir/file2.txt")
# os.rmdir("test_dir/subdir")
# os.rmdir("test_dir")
# print("예시 파일/폴더 삭제.")
[VS Code 터미널 출력]

3. 파일 및 디렉토리 생성/삭제/이름 변경
- os.mkdir(path): 단일 디렉토리를 생성합니다. (경로 중간에 없는 디렉토리가 있으면 오류)
- os.makedirs(path): 경로의 모든 중간 디렉토리를 포함하여 디렉토리를 생성합니다.
- os.rmdir(path): 비어있는 단일 디렉토리를 삭제합니다.
- os.removedirs(path): 빈 하위 디렉토리부터 상위 디렉토리까지 모두 삭제합니다.
- os.remove(path): 파일을 삭제합니다.
- os.rename(src, dst): 파일이나 디렉토리의 이름을 변경합니다.
예시:
# 파일 이름: os_file_ops.py
import os
# 디렉토리 생성
os.makedirs("new_dirs/sub_new_dir", exist_ok=True) # exist_ok=True: 이미 존재해도 오류 발생 안함
print("new_dirs/sub_new_dir 생성.")
# 파일 생성
with open("new_dirs/my_file.txt", "w") as f:
f.write("Hello from os module!")
print("my_file.txt 생성.")
# 파일 이름 변경
os.rename("new_dirs/my_file.txt", "new_dirs/renamed_file.txt")
print("my_file.txt -> renamed_file.txt 이름 변경.")
# 디렉토리 이름 변경
os.rename("new_dirs/sub_new_dir", "new_dirs/renamed_subdir")
print("sub_new_dir -> renamed_subdir 이름 변경.")
# 파일 삭제
os.remove("new_dirs/renamed_file.txt")
print("renamed_file.txt 삭제.")
# 디렉토리 삭제 (비어있어야 함)
os.rmdir("new_dirs/renamed_subdir")
print("renamed_subdir 삭제.")
# 상위 디렉토리까지 삭제 (비어있어야 함)
os.removedirs("new_dirs") # new_dirs가 비어있으면 삭제
print("new_dirs 삭제.")
[VS Code 터미널 출력]

4. os.path 서브 모듈 - 경로 조작
os.path는 경로를 다루는 유용한 함수들을 제공합니다. 운영체제에 따라 경로 구분자(\ 또는 /)가 다르므로, os.path 함수를 사용하여 플랫폼 독립적인 코드를 작성하는 것이 중요합니다.
- os.path.join(path1, path2, ...): 여러 경로 구성 요소를 운영체제에 맞는 구분자로 결합합니다.
- os.path.exists(path): 경로가 존재하는지 확인합니다.
- os.path.isfile(path): 경로가 파일인지 확인합니다.
- os.path.isdir(path): 경로가 디렉토리인지 확인합니다.
- os.path.abspath(path): 상대 경로를 절대 경로로 변환합니다.
- os.path.basename(path): 경로에서 파일 또는 디렉토리의 최종 구성 요소(이름)를 반환합니다.
- os.path.dirname(path): 경로에서 디렉토리 부분(파일 이름 제외)을 반환합니다.
- os.path.split(path): 경로를 디렉토리 부분과 파일 이름 부분으로 분할하여 튜플로 반환합니다.
예시:
# 파일 이름: os_path_ops.py
import os
# 현재 파일의 절대 경로
current_file_path = os.path.abspath(__file__)
print(f"현재 파일의 절대 경로: {current_file_path}")
# 경로 결합
combined_path = os.path.join(os.getcwd(), "my_data", "report.txt")
print(f"결합된 경로: {combined_path}")
# 경로 존재 여부 및 타입 확인
print(f"'{current_file_path}' 존재 여부: {os.path.exists(current_file_path)}")
print(f"'{current_file_path}' 파일인가?: {os.path.isfile(current_file_path)}")
print(f"'{os.getcwd()}' 디렉토리인가?: {os.path.isdir(os.getcwd())}")
# 경로 분리
dirname, basename = os.path.split(current_file_path)
print(f"디렉토리 이름: {dirname}")
print(f"파일 이름: {basename}")
print(f"파일 이름만: {os.path.basename(current_file_path)}")
print(f"디렉토리 이름만: {os.path.dirname(current_file_path)}")
[VS Code 터미널 출력]

Part 2: pathlib 모듈 - 객체지향적인 경로 조작
pathlib 모듈은 파이썬 3.4부터 표준 라이브러리에 포함된 모듈로, 파일 시스템 경로를 객체지향적으로 다룰 수 있게 해줍니다. os.path보다 더 직관적이고 일관된 API를 제공하여 코드를 더 깔끔하게 작성할 수 있습니다.
1. Path 객체 생성
- Path('경로'): 경로 문자열을 Path 객체로 변환합니다.
- Path.cwd(): 현재 작업 디렉토리의 Path 객체를 반환합니다.
- Path.home(): 사용자 홈 디렉토리의 Path 객체를 반환합니다.
예시:
# 파일 이름: pathlib_basic.py
from pathlib import Path
# Path 객체 생성
current_dir = Path.cwd()
print(f"현재 작업 디렉토리 (Path 객체): {current_dir}")
print(f"사용자 홈 디렉토리: {Path.home()}")
# 경로 결합 (슬래시 / 연산자 사용)
new_path = current_dir / "data" / "logs" / "app.log"
print(f"결합된 경로: {new_path}")
# 경로의 구성 요소 접근
print(f"파일 이름: {new_path.name}")
print(f"확장자: {new_path.suffix}")
print(f"부모 디렉토리: {new_path.parent}")
print(f"모든 부모 디렉토리: {new_path.parents}")
[VS Code 터미널 출력]

2. 파일 및 디렉토리 작업 (객체 메서드 사용)
pathlib는 파일/디렉토리 생성, 삭제, 이름 변경, 존재 여부 확인 등을 메서드 형태로 제공합니다.
- path.exists(): 경로가 존재하는지 확인합니다.
- path.is_file(): 경로가 파일인지 확인합니다.
- path.is_dir(): 경로가 디렉토리인지 확인합니다.
- path.mkdir(parents=False, exist_ok=False): 디렉토리를 생성합니다. parents=True는 os.makedirs처럼 중간 디렉토리를 함께 생성합니다. exist_ok=True는 이미 존재해도 오류를 발생시키지 않습니다.
- path.touch(): 빈 파일을 생성합니다. (이미 존재하면 파일의 수정 시간을 업데이트)
- path.unlink(): 파일을 삭제합니다.
- path.rmdir(): 비어있는 디렉토리를 삭제합니다.
- path.rename(target): 파일이나 디렉토리의 이름을 변경합니다.
- path.iterdir(): 디렉토리 내의 모든 항목을 Path 객체로 반환하는 이터레이터를 생성합니다.
- path.glob(pattern): 패턴에 일치하는 파일/디렉토리를 찾는 이터레이터를 생성합니다.
예시:
# 파일 이름: pathlib_file_ops.py
from pathlib import Path
# 디렉토리 생성
new_path_dir = Path("pathlib_dirs/sub_pathlib_dir")
new_path_dir.mkdir(parents=True, exist_ok=True)
print(f"'{new_path_dir}' 디렉토리 생성.")
# 파일 생성
new_file = new_path_dir / "pathlib_file.txt"
new_file.touch()
new_file.write_text("Hello from pathlib!") # 파일에 텍스트 쓰기
print(f"'{new_file}' 파일 생성 및 내용 작성.")
# 파일 존재 여부 및 타입 확인
print(f"'{new_file}' 존재 여부: {new_file.exists()}")
print(f"'{new_file}' 파일인가?: {new_file.is_file()}")
# 파일 이름 변경
renamed_file = new_path_dir / "renamed_pathlib_file.txt"
new_file.rename(renamed_file)
print(f"'{new_file.name}' -> '{renamed_file.name}' 이름 변경.")
# 디렉토리 내용 순회
print(f"\n'{new_path_dir.parent}' 디렉토리 내용:")
for item in new_path_dir.parent.iterdir():
print(f"- {item.name} (파일인가? {item.is_file()}, 디렉토리인가? {item.is_dir()})")
# 파일 삭제
renamed_file.unlink()
print(f"'{renamed_file.name}' 파일 삭제.")
# 디렉토리 삭제
new_path_dir.rmdir()
print(f"'{new_path_dir.name}' 디렉토리 삭제.")
# 상위 디렉토리까지 삭제 (비어있어야 함)
new_path_dir.parent.rmdir() # pathlib_dirs 삭제
print(f"'{new_path_dir.parent.name}' 디렉토리 삭제.")
[VS Code 터미널 출력]

Part 3: os vs pathlib - 언제 무엇을 사용할까?
두 모듈 모두 파일 시스템 작업을 수행할 수 있지만, 각각의 장단점이 있습니다.
특징 | os 모듈 (os.path 포함) | pathlib 모듈 (Path 객체) |
접근 방식 | 함수 기반 (명령형) | 객체지향 기반 (선언형) |
경로 표현 | 문자열 | Path 객체 |
경로 결합 | os.path.join() 함수 사용 | / (슬래시) 연산자 사용 (더 직관적) |
존재 확인 | os.path.exists(), os.path.isfile() 등 | path_obj.exists(), path_obj.is_file() 등 |
파일/폴더 삭제 | os.remove(), os.rmdir() 등 | path_obj.unlink(), path_obj.rmdir() 등 |
디렉토리 순회 | os.listdir() (문자열 리스트 반환) | path_obj.iterdir() (Path 객체 이터레이터 반환) |
호환성 | 오래된 파이썬 버전에서도 사용 가능 | 파이썬 3.4+ 에서 사용 가능 |
가독성 | 익숙하지만 긴 함수 이름, 문자열 조작 필요 | 메서드 체이닝 가능, 더 깔끔하고 직관적 |
언제 무엇을 사용할까?
- pathlib를 선호:
- 새로운 프로젝트를 시작하거나, 파이썬 3.4 이상을 사용하는 경우.
- 객체지향적인 접근 방식이 더 깔끔하고 가독성이 좋다고 생각할 때.
- 경로를 자주 조작하고 여러 작업을 체이닝하여 수행할 때.
- os를 사용할 때:
- 레거시 코드(오래된 코드)를 유지보수하거나, 파이썬 구 버전을 지원해야 할 때.
- 매우 간단하고 일회성인 파일 시스템 작업을 수행할 때.
- os.walk()와 같이 pathlib에 직접적인 대체제가 없는 특정 고급 기능이 필요할 때. (물론 pathlib와 os를 혼용할 수 있습니다.)
일반적으로는 pathlib가 더 현대적이고 파이썬스러운 방식으로 간주되며, 대부분의 새로운 파일 시스템 작업에 권장됩니다.
마무리하며
이번 시간에는 파이썬에서 파일 시스템과 상호작용하는 데 사용되는 두 가지 중요한 모듈인 os 모듈과 pathlib 모듈에 대해 자세히 알아보았습니다.
- os 모듈: 전통적인 함수 기반의 파일 시스템 조작을 제공하며, os.path 서브 모듈을 통해 경로를 다룹니다.
- pathlib 모듈: 객체지향적인 Path 객체를 통해 파일 시스템 경로를 다루며, 더 직관적이고 파이썬스러운 API를 제공합니다.
두 모듈 모두 파일 및 디렉토리 생성, 삭제, 이름 변경, 목록 확인 등 다양한 작업을 수행할 수 있습니다. 현대 파이썬 개발에서는 pathlib가 더 선호되지만, os 모듈도 여전히 유용하게 사용됩니다.
이것으로 '파이썬 고급 문법 & 실전 예제' 챕터의 네 번째 포스팅이 마무리됩니다. 다음 포스팅에서는 파이썬에서 날짜와 시간을 다루는 데 필수적인 datetime 모듈의 사용법에 대해 알아보겠습니다.
궁금한 점이 있다면 언제든지 질문해주세요! 다음 포스팅에서 만나요!
'Python' 카테고리의 다른 글
7-9. 정규 표현식(Regular Expression)으로 문자열 다루기 (0) | 2025.07.09 |
---|---|
7-8. datetime 모듈로 날짜와 시간 다루기 (0) | 2025.07.08 |
7-5. 가상 환경(Virtual Environment)의 이해와 사용법 (0) | 2025.07.05 |
7-3. 데코레이터(Decorator) 이해하기 (0) | 2025.07.03 |
7-2. 제너레이터(Generator)와 yield 키워드 (0) | 2025.07.03 |