🐕

Pythonでファイルのエンコーディングを判定する

2022/03/25に公開

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