Python|ファイルのエンコードを判定する

1. はじめに

Pythonでテキストファイルを扱う際に、ファイルのエンコード(文字コード)を正しく判定することはとても重要です。特に複数のエンコード形式(UTF-8, Shift_JIS, EUC-JPなど)が混在する環境では、誤ったエンコードで読み込むと文字化けや読み込みエラーの原因になります。

本記事では、Python|ファイルのエンコードを判定するというテーマのもと、初心者でも簡単に扱えるライブラリchardetcharset-normalizerの使い方、実務での活用例、エラー対策などを詳しく解説します。

 

2. Pythonでファイルのエンコードを判定する基本

2-1. エンコードとは?

エンコードとは、文字(人が読む情報)をコンピュータで扱えるようにするための文字コードへの変換のことです。よく使われるエンコードには以下のようなものがあります。

  • UTF-8(国際標準、BOMなし)
  • Shift_JIS(日本語Windows環境で多い)
  • EUC-JP(UNIX系環境で日本語を扱う際に使われる)

ファイルのエンコードを自動判定するために、Pythonでは主に以下のライブラリが使われます。

  • chardet(旧定番、広く使われている)
  • charset-normalizer(Python 3.10以降で推奨される)

2-2. chardetでエンコードを判定する

まずは、chardetライブラリを使ってファイルのエンコードを自動判定する基本的な方法を見てみましょう。

import chardet

# ファイルをバイナリモードで読み込む
with open('sample.txt', 'rb') as f:
    data = f.read()
    result = chardet.detect(data)

# 推定されたエンコードを表示
print(result)

実行結果:

{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

このように、`chardet.detect()` を使うと、encoding(判定されたエンコード)、confidence(信頼度)が辞書形式で返されます。

2-3. charset-normalizerで判定する

Python 3.10以降では、charset-normalizerが標準的な選択肢となっています。以下はその使用例です。

from charset_normalizer import from_path

# ファイルのエンコードを判定
result = from_path('sample.txt')

# 最も信頼できる結果を取得
best_guess = result.best()
print(best_guess.encoding, best_guess.strike_rate)

実行結果:

utf_8 100.0

`from_path()` は複数の候補を返しますが、`best()` メソッドで最も信頼性の高いものを取得できます。

 

3. よくある使い方・応用例

3-1. 判定結果に応じてファイルを開く

判定したエンコードを使って、ファイルを正しく読み込む処理を紹介します。

import chardet

file_path = 'sample.txt'

# まずエンコードを判定
with open(file_path, 'rb') as f:
    raw = f.read()
    result = chardet.detect(raw)
    encoding = result['encoding']

# 判定したエンコードで読み込む
with open(file_path, 'r', encoding=encoding) as f:
    text = f.read()

print(text)

実行結果:

これはサンプルファイルです。

このように、判定されたエンコードを元に安全にテキストを扱うことができます。

3-2. バッチ処理で複数ファイルのエンコードを確認する

import os
import chardet

folder_path = './texts'

for filename in os.listdir(folder_path):
    if filename.endswith('.txt'):
        filepath = os.path.join(folder_path, filename)
        with open(filepath, 'rb') as f:
            raw = f.read()
            result = chardet.detect(raw)
            print(f"{filename}: {result['encoding']} ({result['confidence']*100:.1f}%)")

実行結果:

file1.txt: utf-8 (99.0%)  
file2.txt: Shift_JIS (98.5%)

実務では、複数のファイルが異なるエンコードで保存されていることも多く、こうしたバッチ処理が役立ちます。

 

4. 注意点・エラー対策

4-1. 判定ミスに注意

エンコード判定は「推定」であり、100%正確ではありません。特にShift_JISとEUC-JPのように似たパターンのエンコードは混同されることがあります。

4-2. confidence値をチェックする

chardetやcharset-normalizerが返すconfidencestrike_rateが低い場合は、判定が不確実です。条件付きで確認メッセージを表示するような設計も有効です。

if result['confidence'] < 0.8:
    print("エンコードの信頼性が低いため、手動で確認してください")

4-3. BOM付きUTF-8に注意

UTF-8でもBOM(バイト順マーク)が付いていると、`utf-8-sig`として読み込む必要があります。誤って読み込むと、ファイル先頭に「」のような文字が出ることがあります。

 

5. まとめ

今回はPythonでファイルのエンコードを判定する方法について、基本から応用までを解説しました。以下のポイントを押さえておきましょう。

  • chardetまたはcharset-normalizerを使って推定できる
  • confidence(信頼度)を確認してから使うと安全
  • 実務ではバッチ処理や自動変換処理に応用可能

文字化けトラブルを未然に防ぎ、柔軟なファイル処理ができるようになると、Pythonでのテキスト処理の幅が大きく広がります。ぜひ、日常的なスクリプト作成やデータ分析にも取り入れてみてください。

タイトルとURLをコピーしました