Python

WindowsでUTF-8のファイルが開けない!!Pythonでファイルの文字コードを調べるには?

WindowsでUTF-8のファイルが開けない!!Pythonでファイルの文字コードを調べるには?

kifファイルを整理するついでに、文字コードを「UTF-8 with BOM」に揃えてしまおうとPythonを実行したら、エラーが出ました。

出たエラー文は「UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence」。
open()ではエラーにならず、続く.read()でエラーになりました。

原因は文字コード。
Windowsで「UTF-8」のファイルを、Macで「Shift_JIS」のファイルを開こうとすると、エラーになります。
整理したいkifファイルの中には「UTF-8」も混じっていたため、その度に処理が止まってしまいます。

では、あらかじめ文字コードを判定して開くことはできないのか?
結論から言うと、外部ライブラリを使えば可能です。
その方法をまとめました。

 

ファイルの文字コードを判定するには?

外部ライブラリ「chardet」を使って判定します。
まだインストールしていない場合は、コマンドプロンプトで「pip install chardet」を実行しておきましょう。

 

具体的にどう書くの?

from chardet import detect
with open('utf8.txt','rb') as in_f:
    binary = in_f.read()
    character_code = detect(binary)
    print(character_code)
    #{'encoding': 'UTF-8', 'confidence': 1.0, 'language': ''}
    with open('utf8.txt','r',encoding=character_code['encoding']) as in_f2:
    #ここからやりたい処理を書く

流れは、

  1. 「chardet」をインポートする
  2. UTF-8のファイルを"バイナリ"で開く
  3. detect()メソッドで判定する
  4. 判定した文字コードをもとにファイルを開きなおす

です。
detect()メソッドの戻り値は辞書型なので、文字コードを取得する場合は「encoding」キーを使います。

 

まとめ

ファイルの文字コードを調べるには、バイナリで読み込み、外部ライブラリ「chardet」を使います。
判定の結果をもとに文字コードを指定してファイルを開けば、エラーになりません。
これで、文字コードの入り混じったkifファイルを扱えるようになり、狙い通り「UTF-8 with BOM」に揃えることができました。

-Python
-, , , , , , , , , , ,