ヘッダキーによるCSV読込み参照

Python でヘッダ行有りのCSVを読込んでいて、コンテンツ行の値をヘッダで記述された各々のキーで
参照したい場合がある。
pandas を使えば簡単かもしれないが、pandas を使わないケースで考えてみる。

サンプルCSVUTF-8 、BOM があるかもしれない。

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='"'