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 なので一意に簡単にとってこれるし、なにより綺麗だ。
便利だね!