Pythonスクリプトでファイルの符号化方法を識別する方法


Pythonのサードパーティライブラリにはchardetというライブラリがあり、ファイルやWebデータの符号化方式を識別し、対応する符号化方式に従って復号することができる.一般的に、単一の静的ファイルについては、いくつかの編集ソフトウェアを開いて直接その符号化方式を見ることができますが、スクリプトと動的に対話する必要がある場合や、複数のファイルが必要であり、その符号化方式が必ずしも一定ではない場合は、スクリプトでその符号化方式を判断し、復号方式を指定して復号する必要があります.
chardetを用いて,1つのファイルの符号化方式を以下の簡単な文で判断することができる.ここで注意すべきは、読み出しのモードは「wb」であるべきである.
import chardet

f=open(r'filepath','wb')
chardet.detect(f.read())
###output {'encoding': 'UTF-8', 'confidence': 0.99}

しかし、大きなファイルに対してread()メソッドを直接使用すると、すべて読み込まれ、かなり時間がかかります.したがって,大きなファイルに対してはchardetが逐行判断を実現し,情報を蓄積し,判断さえできれば停止し,読み込みを継続しない.次の文を参照してください.
from chardet.universaldetector import UniversalDetector

detector = UniversalDetector()
for line in f:
    detector.feed(line)
    if detector.done: break
detector.close()

print(detector.result)

筆者が前のブログで書いたように、utf 8やISO-8859-1など、ターゲットファイルに含まれる文字に極めて近い符号化方式についても、chardetでは正確な判断ができず、判断を誤ることもあることに注意してください.例えば筆者はchardetが西欧語系のISO-8859-1の符号化方式をトルコ語系のWindows-1254の符号化方式と判断したのでchardetも万能ではなく、ソースファイルの情報が足りない場合があり、正確な判断ができない場合がある.しかし経験によると、一般的にutf 8がだめなら、ISO-8559-1を試してみることができます.