python2系でcsv形式で保存したファイルをexelなどを使って表示しようとするとよく文字化けが起きるのでその時の対策メモ
これだと文字化ける
# -*-coding: utf-8 -*-
import csv
with open('test.csv', 'w') as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow(['日本語でおk?', 'ダメ?'])
色々なサイト見るとどうやらエクセルで読み込むにはBOM
という情報付きのutf-8
にする必要があるらしく、簡単にはutf-8-sig
でエンコードしてやれば良いらしい。
のでimport codecs
を加えてやってみる
# -*-coding: utf-8 -*-
import csv
import codecs
with codecs.open('test.csv', 'w', 'utf-8-sig') as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow([u'日本語でおk?',u'ダメ?'])
だが怒られる
Traceback (most recent call last):
File "text.py", line 25, in <module>
writer.writerow([u'日本語でおk?',u'ダメ?'])
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
こうするともっとひどい
# -*-coding: utf-8 -*-
import codecs
with codecs.open('test.csv', 'w', 'utf-8-sig') as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow(['日本語でおk?', 'ダメ?'])
Traceback (most recent call last):
File "text.py", line 25, in <module>
writer.writerow(['日本語でおk?','ダメ?'])
File "/usr/lib/python2.7/codecs.py", line 688, in write
return self.writer.write(data)
File "/usr/lib/python2.7/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
File "/usr/lib/python2.7/encodings/utf_8_sig.py", line 82, in encode
return encode(input, errors)
File "/usr/lib/python2.7/encodings/utf_8_sig.py", line 15, in encode
return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
結局以下のようにしてcsv
を外すしかありませんでした。
# -*-coding: utf-8 -*-
import codecs
f = codecs.open('test.csv', 'w', 'utf-8-sig')
f.write(u'日本語でおk?,ダメ?')
f.close()
こんなサイトもあるぐらいだし、ホントの所が知りたい…
csvモジュールがUnicode入力をサポートしていない罠 - bonlife