🐕
Pythonでファイルのエンコーディングを判定する
UTF-8とShift JISのファイルが入り混じっているなど、機械的に文字エンコーディングの判定が必要なことがあります。そんなときchardetを使うと便利です。
コード例は以下の通りです。
import chardet
filepath = "SAMPLE.csv"
with open(filepath, 'rb') as f:
c = f.read()
result = chardet.detect(c)
resultとして、{'encoding': 'SHIFT_JIS', 'confidence': 0.99, 'language': 'Japanese'}のような結果が返されます。
大きなデータファイルなどの場合は、判定ができた時点で結果を返すUniversalDetectorを使うとよいでしょう。
from chardet.universaldetector import UniversalDetector
with open(filepath, 'rb') as f:
detector = UniversalDetector()
for line in f:
detector.feed(line)
if detector.done:
break
detector.close()
result = detector.result
SHIFT_JISとCP932はエンコーディングが同じですが文字集合が違うということで判定は間違いがちです。pandasなどで、ファイルにSHIFT_JISにない文字が入っているのにエンコーディングをSHIFT_JISとして読むとエラーになることがあります。ということで、実用的にはCP932を使っておく方がよいことと思います。
if result['encoding'] == 'SHIFT_JIS':
encoding = 'CP932'
df = pandas.read_csv(filepath, encoding=encoding)
Discussion