csv.DictWriter でヘッダー行を書き込むにはどうすればいいですか? 質問する

csv.DictWriter でヘッダー行を書き込むにはどうすればいいですか? 質問する

オブジェクトがありcsv.DictReader、それを CSV ファイルとして書き出したいとします。どうすればいいでしょうか?

私は書けるとわかっているデータの行このような:

dr = csv.DictReader(open(f), delimiter='\t')
# process my dr object
# ...
# write out object
output = csv.DictWriter(open(f2, 'w'), delimiter='\t')
for item in dr:
    output.writerow(item)

しかし、フィールド名をどのように含めることができるのでしょうか?

ベストアンサー1

編集:
2.7 / 3.2では新しいwriteheader()方法また、John Machin の回答では、ヘッダー行を書き込むより簡単な方法が紹介されています。2.7 / 3.2 で現在利用可能な方法
を使用した簡単な例:writeheader()

from collections import OrderedDict
ordered_fieldnames = OrderedDict([('field1',None),('field2',None)])
with open(outfile,'wb') as fou:
    dw = csv.DictWriter(fou, delimiter='\t', fieldnames=ordered_fieldnames)
    dw.writeheader()
    # continue on to write data


DictWriterをインスタンス化するには、フィールド名引数が必要です。ドキュメント:

fieldnames パラメータは、writerow() メソッドに渡される辞書内の値が csv ファイルに書き込まれる順序を識別します。

言い換えると、Python 辞書は本質的に順序付けされていないため、Fieldnames 引数が必要です。
以下は、ヘッダーとデータをファイルに書き込む方法の例です。
注:withステートメントは 2.6 で追加されました。2.5 を使用している場合:from __future__ import with_statement

with open(infile,'rb') as fin:
    dr = csv.DictReader(fin, delimiter='\t')

# dr.fieldnames contains values from first row of `f`.
with open(outfile,'wb') as fou:
    dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
    headers = {} 
    for n in dw.fieldnames:
        headers[n] = n
    dw.writerow(headers)
    for row in dr:
        dw.writerow(row)

@FM がコメントで述べているように、ヘッダーの記述を 1 行にまとめることができます。例:

with open(outfile,'wb') as fou:
    dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
    dw.writerow(dict((fn,fn) for fn in dr.fieldnames))
    for row in dr:
        dw.writerow(row)

おすすめ記事