python - chardet

1 분 소요

python-chardet.

  • 흔히 pd.read_csv를 사용하다고, utf-8이 적합하지 않다거나, unicode error라거나 하는 문제들이 발생하고는 합니다.
  • 이는 csv 파일의 인코딩 방식과 읽어들일 대 해석하는 decoding 방식이 다르기 때문이죠. 하지만, 제가 직접 csv 파일을 만든 것이 아니라면, 이 파일이 어떤 양식을 가지고 있는지에 대해서 정확하게 알기 어렵습니다.
  • 따라서, 이를 위해, chardet라는 파이썬 라이브러리가 있으며, 이는 binary sequence를 읽어서, 어떤 인코딩으로 저장되어있다고 보는 것이 가장 적합한지를 ‘추정’해줍니다. 즉, 가장 가능성이 높은 것이 아마도 이 아이인것 같은데? 라고 알려준다는 이야기죠.

Character encoding.

  • 일반적으로 문자열(text)을 컴퓨터는 우리가 보는 것처럼 활자로 인식하지 않고, bit의 형태, 즉 0과 1로 구성된 배열로 이해한다. 따라서, 이 0과 1로 구성된 값으로부터 우리가 원하는 활자로 변형하기 위해서는 이를 번역해주는 일정한 저장방식, 암호화방식이 필요하게 된다.
  • 세상에는 활자가 매우 많고(러시아, 중국어, 영어 등) 이를 위한 다양한 방식의 각 언어에 적합한 인코딩 방식이 존재한다. 아주 간단하게는 마치, 일대일 함수처럼 만들어주면 되는 것 아닌가? 생각할 수도 있지만, 이것보다는 훨씬 복잡하며(일대일로 처리할 경우 데이터 용량이 매우 극심하게 낭비될 수 있고), 암호화와 유사하다고 생각하면 좋다.

Character encoding auto-detection.

  • 문자 인코딩 방식 자동 탐지(Character encoding auto-detection) 라는 것은, 아직 밝혀지지 않은 binary stream에 대해서 이것이 어떤 인코딩 방식으로 되어 있는지를 파악하는 것을 말한다. 즉, 어찌 보면 일종의 해킹과 유사하다고도 할 수 있고.
  • 사실, 모든 인코딩에 대해서 다 효율적으로 탐색하는 것은 어려울 수 있으나, 몇몇 시퀀스들, 특히 자주 사용되는 시퀀스 들, 가령 너무 랜덤하게 이상하게 표현된 텍스트들이 아니라면, 꽤 정확하게 찾아낼 수 있다. 즉, 이는 거의 language detection 문제와 유사하다고 볼 수 있다.
  • 또한, 이 코드는 Mozilla에서 만든 자동탐지 코드를 사용해서 만들어졌다.

do it.

  • 아래와 같이, binary sequence를 읽어서, 그 값을 그대로 넘겨주면, chardet.detect에서 탐자해줍니다.
  • 또한 sequence를 길게 넘겨줄수록 더 정확해지고 더 많은 시간이 소요됩니다.
import chardet

file_name = 'temp_csv_190114_utf-8.csv'
with open(file_name, 'rb') as rawdata:
    result = chardet.detect(rawdata.read(10))
    # check what the character encoding might be
#print("--"*30)
print(result)
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}

reference

댓글남기기