csv.DictReaderが便利

TSV(CSV)から要素(ヘッダー)を取り出して文字コードを変更してなんか処理したい時の話 - atas の続き

CSVのある uniq な文字列のヘッダーに対して、その column をとってくる処理をおれはゴリ押しで index つくって作成していた。

import csv
csv_file = csv.reader(uploaded_file, dialect=csv.excel)
# utf-8 に強制変換する
# またタプルのジェネレータを返す処理をする
# 以下のような感じ
# for row in _file:
#     yield (force_unicode(value, encoding) for value in row)
unicode_csv_file = convert_file_to_unicode(csv_file)
# 一意な名称の列名からカラムの列を判定する
# ヘッダーにあるので1つ目のジェネレータに存在する
for row in unicode_csv_file:
    for index, value in enumerate(row):
        # ここらへんの記述ちょっとあやしい。 if u"ほげ" in value: でいい気がする。
        if row[u'ほげ'] in value:
            # 例::10番目に存在する
            hoge_column_index = index
        # ここらへんの記述ちょっとあやしい。 if u"もげ" in value: でいい気がする。
        if row[u'もげ'] in value:
            # 例::20番目に存在する
            moge_column_index = index
        break
...

こうして hoge_column_index などを手に入れて、そのカラムの値を取得して……という処理をかいていた。

csv.DictReaderが便利だった

import csv
# csv.DictReader を使用する。
csv_file = csv.DictReader(uploaded_file, dialect=csv.excel)
# utf-8 に強制変換する
# また辞書のジェネレータを返す処理をする
# 以下のような感じ
# for row in _file:
#     yield {force_unicode(key, encoding): force_unicode(value, encoding) for key, value in row.items()}
# ちなみに辞書内包記法はPython 2.7 以降の機能らしいょ!
unicode_csv_file = convert_file_to_unicode(csv_file)

for row in unicode_csv_file:

    # 辞書なので key でとってこれる
    hoge = row[u'ほげ']
    moge = row[u'もげ']

    # たとえば。
    HogeModel.objects.update(hogefield=hoge, mogefiled=moge)

これならジェネレータも綺麗に使えるし、辞書の key なので一意に簡単にとってこれるし、なにより綺麗だ。
便利だね!