Skip to main content

표준 라이브러리

학습 목표

  • pathlib으로 파일 경로를 안전하게 관리할 수 있다
  • datetime으로 날짜와 시간을 처리할 수 있다
  • json으로 데이터를 직렬화/역직렬화할 수 있다
  • re로 정규표현식 패턴 매칭을 수행할 수 있다
  • functools의 주요 도구를 활용할 수 있다

왜 중요한가

Python의 표준 라이브러리는 “배터리 포함(Batteries Included)” 철학을 구현합니다. 외부 패키지 없이도 파일 처리, 날짜 연산, 데이터 직렬화 등 대부분의 작업을 수행할 수 있습니다.

pathlib - 경로 관리

from pathlib import Path

# 경로 생성
home = Path.home()
project = Path("ml_project")
data_dir = project / "data" / "train"  # / 연산자로 결합
print(data_dir)  # ml_project/data/train

# 파일 정보
p = Path("model.py")
print(p.name)       # "model.py"
print(p.stem)       # "model"
print(p.suffix)     # ".py"
print(p.parent)     # "."
print(p.exists())   # True/False
print(p.is_file())  # True/False
print(p.is_dir())   # True/False

# 파일 검색
for py_file in Path(".").glob("**/*.py"):
    print(py_file)

# 디렉토리 생성
Path("outputs/logs").mkdir(parents=True, exist_ok=True)

datetime - 날짜/시간

from datetime import datetime, timedelta, date

# 현재 시각
now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S"))  # "2024-06-15 14:30:25"

# 날짜 연산
tomorrow = date.today() + timedelta(days=1)
one_week_ago = datetime.now() - timedelta(weeks=1)

# 문자열 -> datetime
dt = datetime.strptime("2024-06-15", "%Y-%m-%d")

# 타임스탬프
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"checkpoint_{timestamp}.pt"
print(filename)  # "checkpoint_20240615_143025.pt"

json - 데이터 직렬화

import json

# Python -> JSON 문자열
data = {"name": "실험1", "accuracy": 0.95, "tags": ["bert", "nlp"]}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)

# JSON 문자열 -> Python
parsed = json.loads(json_str)
print(parsed["accuracy"])  # 0.95

# 파일 입출력
with open("config.json", "w") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

with open("config.json", "r") as f:
    loaded = json.load(f)

re - 정규표현식

import re

# 패턴 매칭
text = "이메일: user@example.com, admin@test.co.kr"
emails = re.findall(r"[\w.-]+@[\w.-]+\.\w+", text)
print(emails)  # ["user@example.com", "admin@test.co.kr"]

# 치환
cleaned = re.sub(r"\d+", "[NUM]", "epoch 10, loss 0.5, acc 95")
print(cleaned)  # "epoch [NUM], loss [NUM].[NUM], acc [NUM]"

# 분할
parts = re.split(r"[,;]\s*", "a, b; c, d")
print(parts)  # ["a", "b", "c", "d"]

# 컴파일 (반복 사용 시 성능 향상)
pattern = re.compile(r"loss[=:]\s*([\d.]+)")
match = pattern.search("Training loss=0.234")
if match:
    print(f"손실: {match.group(1)}")  # "0.234"

functools - 함수 도구

from functools import lru_cache, partial, reduce

# lru_cache - 메모이제이션
@lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# partial - 인자 고정
def train(model, lr, epochs):
    print(f"lr={lr}, epochs={epochs}")

train_fast = partial(train, lr=0.1, epochs=5)
train_slow = partial(train, lr=0.001, epochs=100)

# reduce - 누적 연산
from functools import reduce
product = reduce(lambda a, b: a * b, [1, 2, 3, 4, 5])
print(product)  # 120

기타 유용한 모듈

# os.environ - 환경변수
import os
api_key = os.environ.get("API_KEY", "default")

# copy - 깊은 복사
import copy
original = {"a": [1, 2, 3]}
deep = copy.deepcopy(original)

# hashlib - 해시
import hashlib
hash_val = hashlib.sha256("hello".encode()).hexdigest()

# uuid - 고유 식별자
import uuid
experiment_id = str(uuid.uuid4())[:8]
새 코드에서는 pathlib을 권장합니다. 객체지향적이고, / 연산자로 경로를 결합할 수 있어 더 직관적입니다. os.path는 레거시 코드에서 볼 수 있습니다.
기본값(True)이면 한글 등 비ASCII 문자가 유니코드 이스케이프(\uXXXX)로 변환됩니다. False로 설정하면 원래 문자 그대로 출력됩니다.

체크리스트

  • pathlib으로 경로를 조합하고 파일을 검색할 수 있다
  • datetime으로 날짜 포맷 변환과 연산을 할 수 있다
  • json으로 데이터를 직렬화/역직렬화할 수 있다
  • re로 기본적인 패턴 매칭을 수행할 수 있다

다음 문서