1. ホーム
  2. python

[解決済み] csv.DictWriterでヘッダー行を書き込むには?

2022-08-03 07:05:48

質問

私が 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)

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

どのように解決するのですか?

編集してください。

2.7 / 3.2には という新しい writeheader() メソッド . また、John Machin氏の回答では、よりシンプルな方法でヘッダー行を記述しています。

を使った簡単な例 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の引数が必要です。

から ドキュメント :

fieldnamesパラメータは の値の順序を指定します。 メソッドに渡されるディクショナリの値の順序を指定します。 メソッドに渡された辞書の値が csv ファイルに書き込まれる順番を指定します。

別の言い方をすると Pythonのdictsは本質的に順序付けされないので、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さんが触れているように、ヘッダーライティングをワンライナーに凝縮することもできます、例えば。

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)