Python 강좌 / 텍스트 파일 읽고 쓰기: with와 문자 인코딩
텍스트 파일은 문자 인코딩을 지정해 읽고 쓰며 with 문으로 열면 작업이 끝날 때 파일을 닫을 수 있습니다. 쓰기 모드 w는 기존 내용을 지우므로 새 파일 생성과 기존 파일 교체를 구분해야 합니다.
모드와 인코딩 선택하기
| 모드 | 용도 | 기존 파일 |
|---|---|---|
| r | 읽기 | 없으면 오류 |
| w | 새 내용 쓰기 | 기존 내용을 잘라냄 |
| a | 끝에 추가 | 없으면 생성 |
| x | 새 파일만 생성 | 이미 있으면 오류 |
인코딩은 바이트를 문자로 해석하는 규칙입니다. 환경 기본값에 기대지 말고 UTF-8 파일에는 encoding="utf-8"을 명시합니다. errors="ignore"는 읽히지 않는 데이터를 버릴 수 있으므로 오류를 없애는 일반 해결책으로 사용하지 않습니다.
관련 동작과 지원 조건은 텍스트 파일 읽고 쓰기: with와 문자 인코딩 관련 공식 문서에서 확인할 수 있습니다.
전체 예제와 실행 결과
별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python text_files.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.
text_files.py 파일의 전체 내용입니다.
from pathlib import Path
path = Path("notes-demo.txt")
with path.open("w", encoding="utf-8", newline="\n") as f:
f.write("coffee:3500\n")
f.write("lunch:8000\n")
with path.open("a", encoding="utf-8") as f:
f.write("bus:2500\n")
with path.open("r", encoding="utf-8") as f:
for line in f:
print(line.rstrip("\n"))
예상 결과는 다음과 같습니다.
coffee:3500 lunch:8000 bus:2500
한 번에 읽기와 줄 단위 읽기
read()는 남은 내용을 문자열로 읽고, for line in f는 줄을 하나씩 처리합니다. 큰 파일 전체를 메모리에 올릴 필요가 없다면 줄 단위 처리가 자연스럽습니다. 반복으로 읽고 난 파일 객체는 끝에 있으므로 다시 읽으려면 다시 열거나 seek로 위치를 옮겨야 합니다.
strip()은 줄바꿈뿐 아니라 양끝 공백도 제거합니다. 공백이 데이터의 일부라면 rstrip("\n")처럼 제거 대상을 한정합니다. 운영체제와 newline 설정에 따라 줄 끝 변환이 적용될 수 있다는 점도 구분합니다.
원본을 보호하는 쓰기 절차
예제 파일은 테스트용이며 매번 w 모드로 초기화합니다. 실제 업무 파일은 백업 후 별도 임시 파일에 쓰고 검증한 뒤 교체하는 절차를 검토합니다. 쓰기 도중 오류가 나면 기존 파일이 이미 비어 있을 수 있으므로 with가 원본 보존까지 보장한다고 생각하면 안 됩니다.
FileNotFoundError는 경로·폴더 여부, PermissionError는 권한·다른 프로그램의 잠금 여부를 확인합니다. UnicodeDecodeError는 파일의 실제 인코딩을 확인해야 합니다. w를 a로 바꿔 재실행하면 데이터가 중복되는지 비교한 뒤 예제를 원래대로 되돌립니다.




