Python에서 파일의 인코딩(encoding)을 확인하는 방법을 알아보자.
개요
파일을 읽을 때 인코딩이 맞지 않으면 한글이 깨지거나, 파일을 읽을 수 없는 경우가 발생한다. 이런 경우 파일의 인코딩을 확인하여 적절한 인코딩으로 파일을 읽어야 한다. 이때 chardet
라이브러리를 사용하여 파일의 인코딩을 확인할 수 있다.
예를 들어 인코딩에 문제가 있을 경우(파일이 UTF-8 인코딩이 아닌 경우) 다음과 같은 에러가 발생한다.
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte
그래서 해당 파일의 인코딩을 확인 후 파일을 읽어오는 함수를 사용할 때 인코딩 관련 인자에 적절한 인코딩 값을 할당해야 비로소 제대로 파일을 읽어올 수 있다.
실습
실습에 사용할 데이터는 공공데이터 포털의 “부산교통공사_도시철도역사정보” 데이터이다. 다음의 링크에서 원본을 다운로드 받을 수 있다.
※ https://www.data.go.kr/data/15043686/fileData.do#tab-layer-file
상기 데이터 제공에 문제가 있을 수 있기에 미리 다운로드 받아놓은 다음의 데이터를 사용할 수도 있다.
※ Korea_Busan_metro_stn_info_210226.csv 다운받기 [클릭]
해당 데이터를 그냥 읽으면 에러가 나기 때문에 다음의 코드로 인코딩을 확인할 수 있다.
1 | import chardet |
그리고 Pandas 라이브러리의 read_csv()
함수의 “encoding” 인자에 “utf-16”을 입력하면 해당 파일을 제대로 읽어올 수 있는 것을 알 수 있다. (공공데이터 담당자가 tsv 파일을 csv로 제공하는 사소한 실수가 있긴 하다)
1 | df = pd.read_csv("Korea_Busan_metro_stn_info_210226.csv", |
역번호 | 역사명 | 노선번호 | 노선명 | 영문역사명 | 한자역사명 | 환승역구분 | 환승노선번호 | |
---|---|---|---|---|---|---|---|---|
0 | 95 | 다대포해수욕장 | S2601 | 부산도시철도 1호선 | Dadaepo Beach | 多大浦海水浴場 | 일반역 | NaN |
1 | 96 | 다대포항역 | S2601 | 부산도시철도 1호선 | Dadaepo Harbor | 多大浦港 | 일반역 | NaN |
2 | 97 | 낫개역 | S2601 | 부산도시철도 1호선 | Natgae | 羅 浦 | 일반역 | NaN |