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로 바꿔 재실행하면 데이터가 중복되는지 비교한 뒤 예제를 원래대로 되돌립니다.