「CSVファイルを開いたら変な風に表示されるんだけど(キレ気味)」
という問い合わせを情シスやサポートチームの方は受けたことあります(断言)
Windows環境のExcel(文字コード:Shift_JIS)で別のアプリケーションなどから出力されたCSVファイル(文字コード:UTF-8)を開いたために文字化けすることは"あるある"ではないでしょうか。
対処方法はいろいろあると思いますが、Pythonを学び始めたのでPythonで一気にファイルの文字コードを変更したいと思い調べたら、非常にわかりやすいコードがあったので備忘録として残しておこうと思います。
やりたいこと
- Shift_JISのファイルからUTF-8のファイルに変換したい
- 自動的にオリジナルファイルの文字コードを識別したい
バージョン
- 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?
備考1
冒頭の部分は自分が付け足しています。
# srcfile:対象のファイルパス trgfile:変換&生成されるファイルパス
srcfile = './sample_sjis.csv'
trgfile = './sample_utf8.csv'
# 変換後の文字コードを指定(今回の場合は、「utf-8」)
to_codec = 'utf-8'
備考2
少し大きめのファイルであれば22行目のreadでチャンクを指定してあげてもいいと思います。どのくらいが適切なのかはまだ素人の自分にはわかりませんが...
text = f.read()
備考3
こちらでは、古いファイルは削除されて、変換された新しいファイルを古いファイル名に変更していますね。もし両方を残しておきたい場合はコメントアウトしておくのがいいかと。
os.remove(srcfile) # remove old encoding file
os.rename(trgfile, srcfile) # rename new encoding
備考4
参考ページには他の方のコードもあるので、そちらも一見の価値があります!!
ではでは、よいPythonライフを!