【Python】ファイルの文字コードを自動判定して変換する

CSVファイルを開いたら変な風に表示されるんだけど」


 という問い合わせを情シスの方は受けたことあります(断言)
Windows環境のExcel文字コードShift_JIS)で別のアプリケーションなどから出力されたCSVファイル(文字コードUTF-8)を開いたために文字化けすることは"あるある"ではないでしょうか。


対処方法はいろいろあると思いますが、Pythonを学び始めたのでPythonで一気にファイルの文字コードを変更したいと思い調べたら、非常にわかりやすいコードがあったので備忘録として残しておこうと思います。


やりたいこと

  • Shift_JISのファイルからUTF-8のファイルに変換したい
  • 自動的にオリジナルファイルの文字コードを識別したい


バージョン


コード

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ライフを!