Python でヘッダ行有りのCSVを読込んでいて、コンテンツ行の値をヘッダで記述された各々のキーで
参照したい場合がある。
pandas を使えば簡単かもしれないが、pandas を使わないケースで考えてみる。
A, B, C あ, い, う 10, 20, 30
csv.reader()実行前に先にファイルポインタ.readline() でヘッダ行を読んでしまう方法
with codecs.open('sample.csv', 'r', 'utf-8') as fr: head = fr.readline().rstrip('\r\n').lstrip(u'\ufeff').split(',') dict = { k.strip(' "'):v for k, v in zip(head, range(len(head))) } reader = csv.reader(fr, skipinitialspace=True) for row in reader: print('A->%s B->%s C->%s' % (row[dict['A']], row[dict['B']], row[dict['C']]) )
A->あ B->い C->う A->10 B->20 C->30
これは、↑↑ dict を生成する時、 k.strip(' "') でキー値に余計な空白とCSVが括り文字ダブルクォートが有りの
場合も対応する。
next() で、csv.reader() のイテレータからヘッダ行を読込んでしまう方法
with codecs.open('sample.csv', 'r', 'utf-8') as fr: reader = csv.reader(fr, skipinitialspace=False, quotechar='"') h = next(reader) head = [h[0].lstrip(u'\ufeff')] head.extend(h[1:]) dict = { k.strip(' "'):v for k, v in zip(head, range(len(head))) } for row in reader: print('A->%s B->%s C->%s' % (row[dict['A']], row[dict['B']], row[dict['C']]) )
ヘッダ行の読込みも csv.reader() のイテレータなので、正統な方法に思えるのだが、
手数が多い上に、 csv.reader() の生成は、括り文字、カンマデリミタの後の空白
など気をつけなければならない。
ヘッダの dict は、enumerate で生成しても良いはず!
dict = { k.strip(' "'):v for k, v in zip(head, range(len(head))) }
の代わりに、
dict = { v.strip(' "'):i for i, v in enumerate(head) }
skipinitialspace=False なら、quotechar='"'