好きなものだけ書く。ポジティブに。

好きなことを楽しく。プログラミング、写真、音楽、ガジェットとか。

python2.7系 csv モジュールでの書き込みは unicode型はNG!

プログラムの話しでっす。

結論

csvモジュールで書き込みする時は、unicode型はダメです。 str型で文字コードUTF-8なもので統一しましょう。

サンプル

# coding=utf-8

import csv

sample_header = [u"col{}".format(i) for i in range(1, 6)]
sample_data = [
  [u"あ", u"い", u"う", u"え", u"お"]
]

with open('/tmp/sample.csv', "wb") as fh:
    writer = csv.writer(fh, lineterminator=u'\n')
    writer.writerow(sample_header)
    for row in sample_data:
        row = [x.encode("utf-8") for x in row]
        writer.writerow(row)

ざっくり解説

元のデータがunicode型で渡ってきて(サンプルの sample_data のように) そのまま書き込もうとすると以下のようなExceptionを吐きます。

Traceback (most recent call last):
  File "sample.py", line 14, in <module>
    writer.writerow(row)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3042' in position 0: ordinal not in range(128)
[Finished in 0.264s]

unicodeで渡ってきた時には .encode("utf-8") すれば str型になるので csv モジュールもすんなり飲み込んでくれるようです。