ファイルじゃなくて文字列でcsvが欲しかった
GAE/Pでcsv作りたかったんだけど、クォートとか項目数が多かったりするとなーと思うとめんどくさい。
フォーマット文字列?テンプレート?リストをjoinする?とか思ったけどやっぱクォートがめんどくさい。
そこでcsvモジュール。
クォートとかカンマ以外のデリミタ使うとか、その辺の処理をうまいことやってくれる。
けど、readerもwriterも入出力はファイルで文字列に直接出力したりできない。
そこで(またかよ)StringIOモジュール。
ファイルのように文字列を読み書きできる。
ってことでこんな風にしてcsvモジュール使うとcsvな文字列を手に入れられた。
# -*- coding: utf-8 -*- import csv import StringIO s = StringIO.StringIO() csv_writer = csv.writer(s) list = [ {'name': 'item1', 'value': 'foo string'}, {'name': 'item2', 'value': 'bar "quoted" string'}, {'name': 'item3', 'value': u'unicode文字列'}, ] for item in list: # csv用のタプルを作る _item = ( 'string', item['name'], item['value'], ) # unicode文字列はutf8に変換する item_out = [ _str.encode('utf8') for _str in _item] csv_writer.writerow(item_out) csv = s.getvalue() s.close() print csv
Dialectクラスっての使えばcsvの形式をよしなにできるけど今回はデフォルトで良かったのでまあそんなこと。
あとprintしてるのはunicode文字列じゃなくて文字列なのだと思う。まあそう言うのもめんどくさい。