【Python】ファイルの文字コードを自動判定して変換する
「CSVファイルを開いたら変な風に表示されるんだけど」
という問い合わせを情シスの方は受けたことあります(断言)
Windows環境のExcel(文字コード:Shift_JIS)で別のアプリケーションなどから出力されたCSVファイル(文字コード:UTF-8)を開いたために文字化けすることは"あるある"ではないでしょうか。
対処方法はいろいろあると思いますが、Pythonを学び始めたのでPythonで一気にファイルの文字コードを変更したいと思い調べたら、非常にわかりやすいコードがあったので備忘録として残しておこうと思います。
やりたいこと
バージョン
- Python 3.7.6
- chardet 3.0.4
コード
import os from chardet import detect srcfile = './sample_sjis.csv' trgfile = './sample_utf8.csv' to_codec = 'utf-8' # get file encoding typ def get_encoding_type(file): with open(file, 'rb') as f: rawdata = f.read() return detect(rawdata)['encoding'] from_codec = get_encoding_type(srcfile) # add try: except block for reliability try: with open(srcfile, 'r', encoding=from_codec) as f, open(trgfile, 'w', encoding=to_codec) as e: text = f.read() # for small files, for big use chunks e.write(text) os.remove(srcfile) # remove old encoding file os.rename(trgfile, srcfile) # rename new encoding except UnicodeDecodeError: print('Decode Error') except UnicodeEncodeError: print('Encode Error')
引用元:How to convert a file to utf-8 in Python?
備考
冒頭の部分は自分が付け足しています。
# srcfile:対象のファイルパス trgfile:変換&生成されるファイルパス srcfile = './sample_sjis.csv' trgfile = './sample_utf8.csv' # 変換後の文字コードを指定(今回の場合は、「utf-8」) to_codec = 'utf-8'
少し大きめのファイルであれば22行目のreadでチャンクを指定してあげてもいいと思います。どのくらいが適切なのかはまだ素人の自分にはわかりませんが...
text = f.read()
こちらでは、古いファイルは削除されて、変換された新しいファイルを古いファイル名に変更していますね。もし両方を残しておきたい場合はコメントアウトしておくのがいいかと。
os.remove(srcfile) # remove old encoding file os.rename(trgfile, srcfile) # rename new encoding
引用元には他の方のコードもあるので、そちらも一見の価値があります!!
ではでは、よいPythonライフを!