[Pandas] csv 불러오거나 저장할 때 한글 깨짐

728x90

문제설명

한국어로 되어 있는, 공공기관의 데이터를 불러오는 과정에서 우리는 한글이 자주 깨지는 것을 목격할 수 있다.

아래와 같이 csv에서 불러오는 과정에서 말이다.

pd.read_csv('PATH//data.csv')

 

불러오는 것 외에도 Pandas의 DataFrame을 사용하다보면, CSV로의 변환을 자주 사용하게 된다.

아래와 같은 코드로 DataFrame을 csv로 변환, 저장한다.

 

df.to_csv('PATH//data.csv')

 

 

이렇게 불러오거나 저장하는 과정에서 한글이 자주 깨지는 현상이 발생한다.

이는 한글을 표현하는 비트 수의 차이에서 발생한다.

 

해결방법

pd.read_csv('PATH//data.csv', encoding='utf-8-sig') # encoding = 'cp949'
df.to_csv('PATH//data.csv', encoding='utf-8-sig') # encoding = 'cp949'

 

원인 설명

한글을 컴퓨터에 저장할 수 있도록 비트화하는 것을 Encoding이라고 한다.

이 때, 각 인코딩 방법은 한글을 표현하는 비트 수에 차이가 발생하고,

제한된 비트수로 파일 내의 한글을 모두 표현하지 못하는 경우에 한글이 깨지게 된다.

 

한글을 표현하는 인코딩을 대표적으로 아래와 같다.

 

cp949, ANSI, uft-8

 

보통 이 중에서 cp949를 많이 사용하는데, 본인은 utf-8을 추천한다.

utf-8 중에서도 BOM을 지원하는 utf-8-sig를 추천한다.

 

그 차이점은 아래와 같다.

 

UTF-8은 국제 표준으로, 전 세계 대부분의 언어를 표현할 수 있다는 장점이 있다. 

한국어뿐만 아니라, 일본어, 중국어, 아랍어 등 다양한 언어를 지원하여 글로벌 환경에서도 사용이 용이하다. 

반면, CP949는 한국어를 표현하기 위해 만들어진 인코딩 방식으로, 

윈도우 운영 체제에서 많이 사용되며, 한국어와 한자 표현에 강점을 가지고 있다. 

하지만 CP949는 국제적인 호환성이 떨어지고, 다른 운영 체제에서 문자가 깨질 가능성이 높다는 단점이 있다.

UTF-8과 UTF-8-SIG의 차이는 'BOM(Byte Order Mark)'의 유무이다. BOM은 파일의 맨 앞에 추가되는 몇 바이트의 특수한 마크로, 파일의 바이트 순서를 표시한다. 일반적인 UTF-8은 BOM을 포함하지 않지만, UTF-8-SIG는 BOM을 포함하고 있어 파일을 읽는 프로그램이 해당 파일이 UTF-8 인코딩임을 쉽게 인식할 수 있도록 도와준다. 따라서 BOM을 지원하는 UTF-8-SIG는 파일을 읽는 프로그램 간의 인코딩 충돌을 줄이는 데 유리하다.

특히, 윈도우 환경에서 UTF-8 인코딩 파일을 다룰 때 BOM이 없으면 메모장이나 일부 프로그램에서 파일이 제대로 인식되지 않는 경우가 발생할 수 있다. UTF-8-SIG를 사용하면 이러한 문제를 피할 수 있기 때문에, 여러 플랫폼에서 파일을 원활히 사용하고자 할 때 UTF-8-SIG를 권장한다.

ANSI는 오래된 인코딩 방식으로, 제한된 문자 집합만을 지원하기 때문에 한국어를 포함한 다국어 환경에서는 문제가 발생할 수 있다. 또한, ANSI는 운영 체제에 따라 다르게 구현되기 때문에 호환성 문제가 심각하다. 

반면, UTF-8은 모든 플랫폼에서 동일하게 작동하므로 더 안전하게 사용할 수 있다.

결론적으로, 한글 인코딩을 선택할 때는 호환성과 국제 표준을 고려하여 UTF-8을 사용하는 것이 좋다. 

특히, 다른 운영 체제나 프로그램과의 호환성 문제가 우려된다면, UTF-8-SIG를 사용하여 BOM을 포함하는 것이 좋은 선택이다. 이렇게 하면 파일을 열 때 한글이 깨지는 문제를 최소화하고, 다양한 환경에서 동일한 결과를 보장할 수 있다.

728x90