UnicodeDecodeError의 원인과 대처법【Python】

2019/6/5

pandas에서 csv 파일 형식의 데이터 세트를 읽으려고하면 즉시 "UnicodeDecodeError: 'utf-8' codec can't decode byte 0x91 in position 1: invalid start byte"라는 오류가 발생했기 때문에 그 원인과 해결책 메모해 둡니다.

오류 내용

csv 파일을 pd.read_csv에서 읽습니다.그러면...

import pandas as pd df = pd.read_csv('data.csv')

>> 유니코드디코드오류: 'utf-8' codec can't decode byte 0x91 in position 1: invalid start byte

유니코드 디코딩(문자 코드를 문자로 변환) 오류가 발생했습니다.
덧붙여서 문자를 문자 코드로 변환하는 것은 인코딩이라고합니다.

원인

PC 내부에서는, 문자를 그대로의 형태로 인식하고 있는 것은 아니고, 사전에 개개의 문자에 할당한 번호(문자 코드)로서 취급하고 있습니다.

문자 코드에는 언어나 번호를 할당하는 방법의 차이에 따라 많은 방식이 있습니다. UTF-8은 모든 언어로 사용할 수 있도록 세계 표준의 통일 표준으로 설정된 유니코드용 인코딩 방식 중 하나입니다.
하지만 UTF-8도 완전하지 않은 것 같습니다 (Wikipedia :일본어 환경에서 유니 코드 문제)

문제의 원인이 된 문자는 모르지만 csv 파일에는 일본어 문자가 포함되어 있기 때문에 일본어 문자 코드와 UTF-8을 잘 변환하지 못하면 유니 코드 디코드 오류가 발생합니다. 라고 생각합니다.

해결책

read_csv()로 읽을 때 encoding 형식을 인수에서 일본어 문자 코드(shift_jis 등)로 지정해 준다.

df = pd.read_csv('data.csv', encoding='shift_jis')

이것으로 잘 읽을 수있었습니다.

기타 일본어 대응의 Encodings 형식

덧붙여서 일본어를 표현할 수 있는 문자 코드는 복수 있어, Python이 표준으로 구현하고 있는 것은 이하의 것입니다. (참조:List of Python standard encodings )

  • cp932
  • euc_jp, euc_jis_2004, euc_jisx0213
  • iso2022_kr, iso2022_ko_1, iso2022_ko_2, iso2022_ko_3
  • iso2022_kr_2004, iso2022_kr_2ext
  • shift_jis, shift_jis _2004, shift_jisx0213

다만, 대체로는 메이저 커녕 shift_jis 인가 cp932 로 잘 읽어들일 수 있게 되어 있는 인상입니다.