Python·pandas 한글 깨짐 해결하기

pd.read_csv 가 UnicodeDecodeError 로 멈추거나, to_csv 로 저장한 파일이 엑셀에서 깨지나요? 대부분 encoding 에 cp949 나 utf-8-sig 를 지정하면 해결됩니다. 이미 깨진 파일은 위 상자에서 바로 복구할 수 있습니다.

텍스트와 다음 파일을 지원합니다:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

엑셀 내보내기, 데이터베이스 덤프, 자막, 웹사이트 코드 등.

복구하기

  1. 파일을 끌어다 놓거나 텍스트 붙여넣기
  2. 자동으로 복구
  3. 복사하거나 내려받기
또는 파일을 여기로 끌어다 놓기
  • 업로드 없음. 파일은 브라우저 안에서 복구되며 기기 밖으로 나가지 않습니다.

  • EU 내 서버. Mojibuster는 핀란드(EU)의 서버에서 운영되며 EU 일반 개인정보 보호법(GDPR)이 적용됩니다. GDPR 원문(EUR-Lex, 영어)

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로 먼저 복구한 뒤 읽는 편이 간단합니다.

CP949 CSV를 encoding='latin-1'로 읽어 다시 저장한 경우

깨진 글자

°í°´¸í,Áö¿ª,¸ÅÃâ
¹ÚÁöÈÆ,¼­¿ïƯº°½Ã,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는 깨진 글자만 바꾸고 쉼표, 따옴표, 줄 바꿈은 그대로 둡니다.

관련 안내