まず、モジュール以外の手法で CSV データを生成しても、csv
多くの友人を獲得することはできません。それは仕事に適したツールです。
そのモジュールで出力を生成する最も便利writer.writerows()
な方法は、ネストされたリスト (またはシーケンスの反復子) を取る を使用することです。ジェネレーターは、まさにそれを表現する良い方法です。
def csv_spec(queryset):
for employee in queryset:
yield (
employee.id,
employee.manager.first_name,
employee.user.last_login,
employee.contact.phone_number)
w = csv.writer(outfile)
w.writerows(csv_spec(something))
編集:つまり、テンプレートを使用するのと同じ理由でテンプレートのようなものが必要だと言っていますが、テキストの代わりに CSV を生成します。完全なテンプレートがなくても、プレースホルダーにある種類の式を解析して処理するように jinja に依頼できます。
いくつかのデータがあると仮定します:
>>> from collections import namedtuple
>>> from datetime import datetime
>>> Employee = namedtuple('Employee', 'id manager user contact')
>>> Person = namedtuple('Person', 'first_name last_name')
>>> Account = namedtuple('Account', 'username password last_login')
>>> Contact = namedtuple('Contact', 'phone_number email')
>>> data = [
... Employee(0, Person('Alice', 'Brown'),
... Account('abrown', 'secret', datetime(2013, 3, 3)),
... Contact('5551234', 'abrown@example.com')),
... Employee(1, Person('Bob', 'Jones'),
... Account('bjones', 'safe', datetime(2013, 3, 3)),
... Contact('5555678', 'bjones@example.com')),
... Employee(2, Person('Carol', 'Smith'),
... Account('csmith', 'hidden', datetime(2013, 3, 3)),
... Contact('5559012', 'csmith@example.com'))]
およびテンプレート (これをファイルから簡単に読み取ることができます)
>>> import StringIO
>>> template = StringIO.StringIO('''employee.id
... employee.manager.first_name
... employee.user.last_login
... employee.contact.phone_number''')
式コンパイラを使用するには、環境が必要です。オプションを指定する必要はありません:
>>> import jinja2
>>> env = jinja2.Environment()
>>> template_filter = map(env.compile_expression, template)
前述したように、csv モジュールを使用します。
>>> import csv
>>> import sys
>>> writer = csv.writer(sys.stdout)
最後に、コンパイルされた式を使用して、一度に 1 行ずつデータを実行し、各行に各式を適用できます。
>>> writer.writerows([[field(employee=row) for field in template_filter]
... for row in data])
0,Alice,2013-03-03 00:00:00,5551234
1,Bob,2013-03-03 00:00:00,5555678
2,Carol,2013-03-03 00:00:00,5559012