os: 운영체제 상호작용 및 경로 관리
파이썬의 os 모듈은 운영체제와 상호작용하며 파일 시스템을 제어하는 가장 기본적인 도구입니다. 경로 병합, 디렉토리 생성 및 삭제, 파일 상태 확인 등 로우레벨 작업을 수행할 때 유용합니다.
import os
# 운영체제 이름 확인 (posix, nt 등)
print(f"OS Type: {os.name}")
# 현재 작업 디렉토리 확인
current_dir = os.getcwd()
print(f"Current Path: {current_dir}")
# 경로 병합 및 절대 경로 변환
target_subdir = "./workspace/logs/daily"
file_name = "app.log"
full_path = os.path.join(target_subdir, file_name)
abs_path = os.path.abspath(full_path)
print(f"Joined Path: {full_path}")
print(f"Absolute Path: {abs_path}")
# 파일 및 디렉토리 정보 추출
print(f"Base Name: {os.path.basename(full_path)}")
print(f"Dir Name: {os.path.dirname(full_path)}")
print(f"Exists: {os.path.exists(full_path)}")
# 디렉토리 순회 (os.walk)
for root, dirs, files in os.walk("."):
for name in files:
print(os.path.join(root, name))
# 디렉토리 생성 (계층적 생성)
try:
os.makedirs(target_subdir, exist_ok=True)
print("Directory ready")
except OSError as e:
print(f"Error: {e}")
# 파일명 변경 및 이동
try:
if os.path.exists("old_name.txt"):
os.rename("old_name.txt", "new_name.txt")
except FileNotFoundError:
pass
# 파일 삭제
if os.path.isfile("temp.tmp"):
os.remove("temp.tmp")
pathlib: 객체 지향적 경로 조작
pathlib은 파이썬 3.4부터 도입된 모듈로, 경로를 단순 문자열이 아닌 객체로 취급합니다. 코드 가독성이 높고 / 연산자를 사용한 직관적인 경로 병합이 특징입니다.
from pathlib import Path
# 현재 경로 및 홈 디렉토리 객체 생성
working_dir = Path.cwd()
home_dir = Path.home()
# 경로 병합 (연산자 오버로딩 활용)
config_path = working_dir / "configs" / "settings.json"
print(f"Config Path: {config_path}")
# 디렉토리 생성 및 존재 여부 확인
temp_folder = Path("test_assets")
temp_folder.mkdir(parents=True, exist_ok=True)
# 파일 읽기 및 쓰기 (Context Manager 없이 간결하게 처리)
doc_file = temp_folder / "note.txt"
doc_file.write_text("Hello, Python Pathlib!", encoding="utf-8")
content = doc_file.read_text(encoding="utf-8")
print(f"File Content: {content}")
# 파일 속성 접근
if doc_file.exists():
print(f"Filename: {doc_file.name}")
print(f"Suffix: {doc_file.suffix}")
print(f"Stem: {doc_file.stem}")
print(f"Parent: {doc_file.parent}")
# 패턴 매칭 (glob 기능 통합)
for p in Path('.').rglob('*.py'):
print(f"Found Python file: {p}")
shutil: 고수준 파일 작업 및 아카이브
shutil 모듈은 파일 복사, 이동, 삭제 및 압축과 같은 복잡한 파일 작업을 단순화합니다. 특히 디렉토리 전체를 다루는 작업에 강력합니다.
import shutil
from pathlib import Path
source_dir = "./data/source"
backup_dir = "./data/backup"
# 디렉토리 전체 복사 (대상 디렉토리가 없어야 함)
if Path(source_dir).exists() and not Path(backup_dir).exists():
shutil.copytree(source_dir, backup_dir)
# 단일 파일 복사 (메타데이터 포함 여부에 따라 copy, copy2 선택)
shutil.copy("report.pdf", "./data/archive/report_v1.pdf")
# 파일 또는 디렉토리 이동 (이름 변경 포함)
shutil.move("./data/temp.log", "./data/logs/processed.log")
# 디렉토리 트리 삭제 (비어있지 않아도 삭제)
if Path("./old_data").exists():
shutil.rmtree("./old_data")
# 디스크 사용량 확인
usage = shutil.disk_usage("/")
print(f"Total: {usage.total // (2**30)} GB, Used: {usage.used // (2**30)} GB")
# 압축 파일 생성 (zip, tar 등)
shutil.make_archive("backup_archive", "zip", root_dir="./data/backup")
# 압축 해제
shutil.unpack_archive("backup_archive.zip", extract_dir="./restored_data", format="zip")
glob: 와일드카드 패턴 매칭
glob 라이브러리는 유닉스 쉘에서 사용하는 규칙을 사용하여 특정 패턴과 일치하는 파일 목록을 추출할 때 사용됩니다.
import glob
# 특정 확장자 파일 리스트업
txt_files = glob.glob("./docs/*.txt")
print(f"Text Files: {txt_files}")
# 하위 디렉토리 포함 재귀적 검색
all_images = glob.glob("./assets/**/*.png", recursive=True)
# 단일 문자 및 범위 매칭
# data_1.csv, data_2.csv 등을 매칭
indexed_files = glob.glob("./data/data_[0-9].csv")
# 부정형 매칭 (숫자가 포함되지 않은 파일)
non_numeric = glob.glob("./data/*[!0-9]*.csv")
# 반복자(iterator) 형태로 반환하여 메모리 효율성 확보
for item in glob.iglob("./logs/*.log"):
print(f"Processing: {item}")