Python 파일 처리 마스터리: Pathlib와 Context Managers로 흔한 함정 피하기
Source: Dev.to
소개
파일 처리 버그는 눈에 잘 띄지 않을 수 있습니다—프로그램이 바로 크래시되지는 않지만 데이터가 조용히 손상되거나 자원이 누수될 수 있습니다. 이러한 문제는 스크립트가 로컬 머신에서는 정상 작동하지만 인코딩 불일치나 파일 디스크립터 고갈 때문에 서버에서는 실패할 때 특히 고통스럽습니다. 현대적인 도구인 pathlib와 컨텍스트 매니저를 활용해 Python 파일 I/O를 마스터하면 더 신뢰할 수 있고 크로스‑플랫폼 코드를 작성할 수 있습니다.
pathlib와 컨텍스트 매니저 사용하기
전통적인 접근 방식:
f = open('file.txt')
content = f.read()
f.close()
예외가 발생하면 파일이 닫히지 않을 수 있습니다. 관용적인 해결책은 with 컨텍스트 매니저와 OS‑독립적인 경로를 위한 pathlib을 함께 사용하는 것입니다:
from pathlib import Path
file_path = Path("example.txt")
with file_path.open(encoding="utf-8") as f:
content = f.read()
print(content)
encoding="utf-8"을 지정하면 Windows, macOS, Linux 전반에 걸쳐 일관된 동작을 보장합니다.
파일을 효율적으로 읽기
큰 파일의 경우 전체 내용을 메모리로 로드하지 마세요:
with file_path.open(encoding="utf-8") as f:
for line in f:
process(line.strip())
라인 단위로 반복하면 데이터를 스트리밍하게 되므로 사용 가능한 RAM보다 큰 파일도 처리할 수 있습니다.
파일을 안전하게 쓰기
항상 with 블록 안에서 파일을 열어 플러시와 닫기를 보장하세요:
from pathlib import Path
with Path("output.txt").open("w", encoding="utf-8") as f:
f.write("Hello, Python world!\n")
모드를 빼먹으면 Python은 기본적으로 읽기 전용으로 열며 io.UnsupportedOperation 예외를 발생시킵니다. 로그를 추가하려면:
with Path("log.txt").open("a", encoding="utf-8") as f:
f.write(f"Error occurred at {timestamp}\n")
구조화된 포맷 다루기
CSV
문자열을 직접 나누는 대신 csv 모듈을 사용하세요:
import csv
from pathlib import Path
with Path("data.csv").open(encoding="utf-8", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["column_name"]) # 컬럼 순서가 바뀌어도 동작
newline="" 인자는 Windows에서 불필요한 빈 줄이 생기는 것을 방지합니다.
JSON
JSON을 안전하게 직렬화·역직렬화하세요:
import json
from pathlib import Path
data = {"key": "value"}
with Path("config.json").open("w", encoding="utf-8") as f:
json.dump(data, f, indent=4) # 사람이 읽기 쉬운 출력
흔히 저지르는 실수와 해결책
| 실수 | 해결책 |
|---|---|
with 없이 파일을 닫지 않음 | 항상 컨텍스트 매니저 사용 |
| 인코딩 무시 | encoding="utf-8"을 명시적으로 설정 |
| 경로 구분자를 하드코딩 | 크로스‑OS 경로를 위해 pathlib 사용 |
| 큰 파일을 전체 메모리로 읽음 | 반복문(for line in f:)으로 스트리밍 |
파일 모드 혼동(r+ vs w) | 작업에 맞는 올바른 모드 선택 |
추가 읽을거리
프로덕션 수준의 기법, 오류 처리, 고급 도구 등을 다루는 심층 가이드는 Mastering Python File I/O: How to Read and Write Files Easily 를 참고하세요.