【Python】文字コードの自動判別 ~ chardet ~

■ はじめに

文字コードの自動判定する chardet についてのメモ。

■ 公式サイト

https://pypi.org/project/chardet/

■ インストール

conda install chardet

■ 使用上の注意

* 判定できない場合がある(「'encoding': None」)
* 必ずしも 100% ではない
 => 誤検知でデコード時にエラーになる場合もある
 (デコード時のエラーについては、以下の関連記事を参照のこと)

Pythonでの文字コード関連のトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/06/19/121139

■ サンプル

import chardet

with open('aaaaa.txt', 'rb') as file:
  content = file.read()
  result = chardet.detect(content)
  print(result)

with open('derby.log', 'rb') as file:
  content = file.read()
  result = chardet.detect(content)
  print(result)

with open('yolo.py', 'rb') as file:
  content = file.read()
  result = chardet.detect(content)
  print(result)

出力結果

{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
{'encoding': None, 'confidence': 0.0, 'language': None}

■ 大きいファイルを扱う場合

UniversalDetector を利用するといいみたい

サンプル

from chardet.universaldetector import UniversalDetector

def get_encode(file_path, threshold=0.90, default_encode='UTF-8'):
  detector = UniversalDetector()
  try:
    with open(file_path, mode='rb') as file:
      while True:
        binary = file.readline()
        if binary == b'':
          break

        detector.feed(binary)
        if detector.done:
          break
  finally:
    detector.close()

  encoding_info = detector.result
  if encoding_info is None or encoding_info["encoding"] is None or \
    encoding_info["confidence"] < threshold:
    return default_encode
  else:
    return encoding_info["encoding"]


print(get_encode('aaaaa.txt'))
print(get_encode('customer.csv'))
print(get_encode('hello.html'))

出力結果

utf-8
ascii
ascii

参考文献

https://qiita.com/koara-local/items/6b47f3156ca66f28b4ab
https://blog.amedama.jp/entry/2015/11/25/232855
https://qiita.com/morinokami/items/b6edc3b9cf31f4b8b7d1

関連記事

Pythonでの文字コード関連のトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/06/19/121139