반응형
이 글은 공부하며 정리한 내용입니다. 틀리거나 보완할 점이 있다면 댓글로 알려주시면 감사하겠습니다.
1. 핵심 요약
- UnicodeDecodeError: 'cp949' codec can't decode byte 에러는 파이썬이 파일을 읽을 때, 기본 인코딩(cp949 또는 ANSI)으로 읽으려다 실패할 때 발생한다.
- 파일의 실제 인코딩 방식과 읽을 때 설정된 인코딩이 일치하지 않으면 발생한다.
- 보통 UTF-8로 저장된 파일을 Windows 환경에서 열 때 많이 발생한다.
2. 상세 내용 설명
2-1. 에러 메시지 예시
UnicodeDecodeError: 'cp949' codec can't decode byte 0xed in position 42: illegal multibyte sequence
- 'cp949'는 Windows에서 기본적으로 사용하는 문자 인코딩 방식이다.
- 0xed는 해당 인코딩 방식으로 해석할 수 없는 바이트로, UTF-8과 같은 다른 인코딩에서 쓰인 문자일 가능성이 높다.
2-2. 원인
- 파이썬 3에서 open() 함수로 파일을 열 때 인코딩을 명시하지 않으면,
Windows에서는 기본적으로 cp949로 열려고 시도한다. - 그러나 파일이 실제로 UTF-8, EUC-KR 등의 다른 인코딩으로 저장된 경우 디코딩 에러가 발생한다.
2-3. 해결 방법
✅ 인코딩 명시
with open('example.txt', mode='r', encoding='utf-8') as f:
content = f.read()
- 파일의 실제 인코딩 방식이 utf-8이라면 위와 같이 명시적으로 encoding 파라미터를 지정해야 한다.
- utf-8, euc-kr, iso-8859-1 등 상황에 맞는 인코딩으로 지정
✅ 인코딩 확인 방법 (Linux/macOS)
file -i example.txt
- 출력 결과: example.txt: text/plain; charset=utf-8 → utf-8 인코딩 확인 가능
✅ 인코딩 확인 방법 (Windows)
- 메모장으로 열기 → "다른 이름으로 저장" 클릭 → 저장창 하단의 "인코딩" 항목에서 확인 가능
✅ 인코딩 확인 – 파이썬 라이브러리 사용
- chardet 또는 charset-normalizer 라이브러리를 이용하면 파일의 인코딩을 추정할 수 있다.
import chardet
with open('example.txt', 'rb') as f:
result = chardet.detect(f.read())
print(result['encoding'])
- 정확도가 100%는 아니지만, 파일 인코딩을 모를 때 참고용으로 유용하다.
- 설치: pip install chardet
3. 결론
문자 인코딩 문제는 운영체제와 파일 저장 환경에 따라 달라질 수 있다.
Python에서 텍스트 파일을 읽을 때는 항상 인코딩을 명시하는 습관을 들이는 것이 좋다.
특히 Windows 환경에서는 cp949가 기본 인코딩이기 때문에,
UTF-8로 저장된 파일은 encoding='utf-8'을 지정해야 오류 없이 읽을 수 있다.
4. 참고 자료
반응형
댓글