Python UnicodeDecodeError란?
`UnicodeDecodeError`는 Python이 텍스트 파일이나 바이트 데이터를 특정 인코딩 방식으로 디코딩할 수 없을 때 발생하는 예외입니다. 주로 파일을 읽을 때 기본 인코딩(`utf-8`)이 실제 인코딩과 다를 경우 발생하며, 크롤링, 로그 파일 처리, CSV 읽기 등에서 자주 나타납니다.
1. UnicodeDecodeError 발생 원인
- 파일 인코딩이 utf-8이 아닌데 디코딩을 utf-8로 시도함
- Windows에서 생성된 파일(예: cp949, euc-kr 인코딩)을 utf-8로 읽음
- 웹에서 다운로드한 파일이 인코딩 정보 없이 저장됨
- 파일 내부에 깨진 문자(잘못 인코딩된 바이트)가 포함됨
2. UnicodeDecodeError 예시
with open("korean.txt", "r") as f:
text = f.read() # UnicodeDecodeError 발생 가능
오류 메시지 예:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte
3. UnicodeDecodeError 해결 방법
3-1. 올바른 인코딩 지정
파일의 실제 인코딩을 확인하고 `open()` 함수에서 `encoding` 인자를 명시합니다.
# Windows ANSI 파일의 경우
with open("korean.txt", "r", encoding="cp949") as f:
text = f.read()
# EUC-KR도 자주 사용됨
with open("korean.txt", "r", encoding="euc-kr") as f:
text = f.read()
3-2. 인코딩 자동 감지 (chardet)
파일의 인코딩을 모를 경우, `chardet` 라이브러리를 사용해 자동으로 감지할 수 있습니다.
import chardet
with open("korean.txt", "rb") as f:
raw = f.read()
result = chardet.detect(raw)
encoding = result["encoding"]
text = raw.decode(encoding)
print("감지된 인코딩:", encoding)
3-3. 디코딩 오류 무시하기
깨진 문자가 있어도 일단 무시하고 읽어야 하는 경우 `errors='ignore'` 또는 `errors='replace'` 옵션을 사용할 수 있습니다.
with open("korean.txt", "r", encoding="utf-8", errors="ignore") as f:
text = f.read()
> ⚠️ 이 방법은 데이터 손실 가능성이 있으므로 로그나 임시 데이터 처리에만 권장됩니다.
3-4. pandas로 CSV 읽을 때 인코딩 지정
import pandas as pd
# 한글 CSV 파일을 cp949로 읽기
df = pd.read_csv("data.csv", encoding="cp949")
4. 인코딩 종류 정리
| 인코딩 | 사용 예시 |
| utf-8 | 대부분의 웹, 국제 표준 |
| cp949 | Windows 한글 문서 |
| euc-kr | 옛날 웹사이트, 뉴스 데이터 |
| iso-8859-1 | 서유럽 언어권 |
5. 요약 및 결론
- `UnicodeDecodeError`는 인코딩 불일치로 발생합니다.
- 정확한 인코딩을 명시하면 대부분 해결됩니다.
- 자동 인코딩 감지 라이브러리(chardet)를 활용해보세요.
- 일시적으로는 오류 무시 옵션을 사용할 수 있지만, 근본 해결이 우선입니다.
이 가이드를 통해 Python에서 `UnicodeDecodeError`를 효과적으로 처리하고, 다양한 인코딩 데이터를 안정적으로 다룰 수 있습니다.