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:
#ここからやりたい処理を書く
流れは、
- 「chardet」をインポートする
- UTF-8のファイルを"バイナリ"で開く
- detect()メソッドで判定する
- 判定した文字コードをもとにファイルを開きなおす
です。
detect()メソッドの戻り値は辞書型なので、文字コードを取得する場合は「encoding」キーを使います。
まとめ
ファイルの文字コードを調べるには、バイナリで読み込み、外部ライブラリ「chardet」を使います。
判定の結果をもとに文字コードを指定してファイルを開けば、エラーになりません。
これで、文字コードの入り混じったkifファイルを扱えるようになり、狙い通り「UTF-8 with BOM」に揃えることができました。