■ はじめに
文字コードの自動判定する 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