やっとpythonにこなれてきたのでスクレイピングを使って脆弱性情報収集などやろうかなと考えています。
SIerにありがちな、とりあえずcsvに吐いておくというのをやりたいのですが、
ファイルを作成するにあたり
ということを考えています。
この時ヘッダ付きの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の書き込み周りのソースコード読んでみたいですね。