Py) 기초 - 파일 인코딩 확인

Py) 기초 - 파일 인코딩 확인

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
2
3
4
5
6
7
import chardet

file_path = "Korea_Busan_metro_stn_info_210226.csv"
with open(file_path, "rb") as f:
result = chardet.detect(f.readline())
print(result["encoding"])
## UTF-16

그리고 Pandas 라이브러리의 read_csv() 함수의 “encoding” 인자에 “utf-16”을 입력하면 해당 파일을 제대로 읽어올 수 있는 것을 알 수 있다. (공공데이터 담당자가 tsv 파일을 csv로 제공하는 사소한 실수가 있긴 하다)

1
2
3
df = pd.read_csv("Korea_Busan_metro_stn_info_210226.csv", 
sep = "\t", encoding = "utf-16")
df.iloc[:3, :8]
역번호 역사명 노선번호 노선명 영문역사명 한자역사명 환승역구분 환승노선번호
0 95 다대포해수욕장 S2601 부산도시철도 1호선 Dadaepo Beach 多大浦海水浴場 일반역 NaN
1 96 다대포항역 S2601 부산도시철도 1호선 Dadaepo Harbor 多大浦港 일반역 NaN
2 97 낫개역 S2601 부산도시철도 1호선 Natgae 羅 浦 일반역 NaN
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×