読者です 読者をやめる 読者になる 読者になる

山とカメラとプログラムで楽しく暮らす31歳独身貴族日記

主に好きなことを楽しく。自分がふりかえれるようなもの。登山と写真を趣味にしていく過程とか、好きな音楽とか、新しいガジェットの事とかバラバラになるかもしれませんがよろしくお願いします。

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 モジュールもすんなり飲み込んでくれるようです。

広告を非表示にする