paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

pythonでCSVファイルの同ヘッダ列に追記したい

やっとpythonにこなれてきたのでスクレイピングを使って脆弱性情報収集などやろうかなと考えています。

SIerにありがちな、とりあえずcsvに吐いておくというのをやりたいのですが、
ファイルを作成するにあたり

  • headerを付けておきたい
    • Excelに転記できるようにしておくため
  • 同じファイルにタンキングする
    • 最終的に管理ファイルであるExcelに直接書き込む練習

ということを考えています。
この時ヘッダ付きのCSVの動きで戸惑ったのでメモっておきます。

ヘッダ付与

ヘッダ付ける記事は割りと出てきます。
DictWriterでfieldnameにリスト型を渡してwriteheaderでOK。

writer = csv.DictWriter(ファイル名, fieldnames=field名)
writer.writeheader()

同ファイルへ追記

ヘッダー付きCSVファイルを作成するという記事はよくあるんですが。
既にあるファイルに追記するパターンの記事が意外と無いんですよね。
こんな事しないからかもしれませんが。

追記時もヘッダを認識するためにDictWriterが必要の様です。
ヘッダを読んだ後、辞書型でヘッダに追加します。

writer = csv.DictWriter(file名, fieldnames=field名)  
writer.writerow({'a': aヘッダの内容, 'b': bヘッダの内容})  

実際のコードはこんな感じ。
Windows10で試したので文字コードとnewlineを記載してます。
(Versionは3.7.2です)

# coding:utf-8

import csv

Filename = 'sample.csv'

Headers = ['header1', 'header2', 'header3', 'header4', 'header5']

# ヘッダ付きファイル作成しておく
with open(Filename, 'w', newline='') as f:
    w = csv.DictWriter(f, fieldnames=Headers)
    w.writeheader()

# 追記したい内容を辞書側にしておく
Contents = {'header1': 'content1' , 
            'header2': 'content2' , 
            'header3': 'content3' , 
            'header4': 'content4' , 
            'header5': 'content5' 
}

# サンプル的に5行追加する
for fivetime in range(1,6):
    with open(Filename, 'a', newline='') as f:
        w = csv.DictWriter(f, fieldnames=Headers)
        w.writerow(Contents)
  • 結果
PS C:\Users\masashi\Documents> python .\csvheader.py
PS C:\Users\masashi\Documents> cat .\sample.csv
header1,header2,header3,header4,header5
content1,content2,content3,content4,content5
content1,content2,content3,content4,content5
content1,content2,content3,content4,content5
content1,content2,content3,content4,content5
content1,content2,content3,content4,content5

ちゃんとヘッダ名と同じ列に追加されてますね。

DictWriterを使わないとどうなるか

DictWriter無しで追記するとヘッダの値だけがむなしく追加されます。

別ファイル作ってみます。

for fivetime in range(1,6):
    with open(Filename, 'a', newline='') as f:
        w = csv.writer(f) # この行だけ変えてみます
        w.writerow(Contents)
  • 結果
PS C:\Users\masashi\Documents> python .\csvheader2.py
PS C:\Users\masashi\Documents> cat .\sample.csv
header1,header2,header3,header4,header5
header1,header2,header3,header4,header5
header1,header2,header3,header4,header5
header1,header2,header3,header4,header5
header1,header2,header3,header4,header5
header1,header2,header3,header4,header5

DictWriteで追記できました

というわけでDictWriterを使えば同ヘッダ列に行の追加ができました。

Excelを直接いじるプログラムはセルの指定等必要なので結構面倒なのですが、
いったんCSVに吐いておけば割と融通の利くモノになりそうですね。
(とりあえずCSVにするのは綺麗ではないですが)

あと時間があればDictWriteとwriterの書き込み周りのソースコード読んでみたいですね。

参考サイト