read_csv에서 UnicodeDecodeError
pd.read_csv 는 UTF-8을 기대합니다. 공공데이터포털, 은행, 회계 프로그램에서 받은 CSV는 CP949로 저장된 경우가 많아 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 같은 오류가 납니다. 이때 인코딩을 지정하세요.
pd.read_csv('data.csv', encoding='cp949')가 가장 확실합니다.encoding='euc-kr'도 대부분 되지만똠,뷁,햏처럼 EUC-KR에 없는 글자가 있으면 오류가 납니다.cp949는 이런 글자까지 포함합니다.- 인코딩을 모르겠다면 파일을 Mojibuster에 끌어다 놓으세요. 인코딩을 판별해 UTF-8로 저장해 줍니다(EUC-KR을 UTF-8로 변환).
DataFrame에 À̸§ 같은 글자가 보일 때
오류를 피하려고 encoding='latin-1' 로 읽으면 오류는 사라지지만 CP949 한글이 À̸§ 처럼 보입니다. 처음부터 encoding='cp949' 로 다시 읽는 것이 가장 좋습니다. 이미 깨진 값 하나는 value.encode('latin-1').decode('cp949') 로 되돌릴 수 있지만, 정상 셀이 섞여 있으면 오류가 납니다. 파일을 Mojibuster로 먼저 복구한 뒤 읽는 편이 간단합니다.
깨진 글자
°í°´¸í,Áö¿ª,¸ÅÃâ ¹ÚÁöÈÆ,¼¿ïƯº°½Ã,1250000 ÃÖÀ¯Áø,´ë±¸±¤¿ª½Ã,980000
복구 후
고객명,지역,매출 박지훈,서울특별시,1250000 최유진,대구광역시,980000
to_csv로 저장한 파일이 엑셀에서 깨질 때
df.to_csv('export.csv') 는 BOM 없는 UTF-8로 저장합니다. 한국어판 엑셀은 이런 파일을 CP949로 열어서 한글이 깨집니다. encoding='utf-8-sig' 로 저장하면 BOM이 붙어 엑셀이 UTF-8로 인식합니다. 엑셀 쪽 해결법은 엑셀 CSV 한글 깨짐에 정리했습니다.
CP949 CSV만 받는 기관 시스템에 올려야 한다면 encoding='cp949' 로 저장하세요. 다만 CP949에 없는 이모지나 특수 문자가 있으면 오류가 납니다. errors='replace' 를 쓰면 그 글자가 ? 로 바뀌어 되돌릴 수 없게 됩니다.
Windows에서 open()
open('file.txt') 를 encoding 없이 쓰면 한국어 Windows에서는 cp949 로 읽습니다. 맥이나 리눅스에서 잘 되던 스크립트가 Windows에서 UnicodeDecodeError 를 내는 흔한 이유입니다. 항상 encoding='utf-8' 을 지정하거나 환경 변수 PYTHONUTF8=1 을 설정하세요. PEP 686에 따라 앞으로의 Python에서는 UTF-8이 기본이 됩니다.
requests로 받은 웹 데이터
requests 는 Content-Type 헤더에 문자셋이 없는 텍스트 응답을 ISO-8859-1로 가정합니다. 그러면 UTF-8 페이지의 한글이 안녕 처럼 보입니다. 먼저 response.encoding = 'utf-8' 을 지정하거나, JSON이면 response.json() 을 쓰세요. 오래된 한국 사이트는 response.encoding = 'cp949' 가 필요할 수 있습니다.
자주 묻는 질문
파이썬 라이브러리로 고칠 수는 없나요?
ftfy 는 UTF-8을 서유럽 인코딩으로 읽은 깨짐을 잘 고치지만 CP949 깨짐에는 약합니다. 파일 하나라면 코딩 없이 Mojibuster로 고치고 바뀐 곳을 저장 전에 확인하는 편이 빠릅니다.
cp949와 euc-kr 중 무엇을 써야 하나요?
cp949 를 쓰세요. EUC-KR의 확장이라 EUC-KR 파일도 그대로 읽고, 현대 한글 11,172자를 모두 담고 있습니다.
구분자와 숫자는 그대로 유지되나요?
네. Mojibuster는 깨진 글자만 바꾸고 쉼표, 따옴표, 줄 바꿈은 그대로 둡니다.