AI資格ドリル
資格を選ぶ

用語比較

csv.reader と csv.DictReader の違い|行をリストで読むか、辞書で読むか(Python3基礎)

どちらもCSVファイルを1行ずつ読むための仕組みです。違いは、1行を「文字列のリスト」で受け取るか、「列名をキーにした辞書」で受け取るかです。

何番目の列かで扱うなら reader、列名で扱うなら DictReaderと覚えると、使い分けを整理できます。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。

csv.readerとcsv.DictReaderの要点

csv.reader

各行を文字列のリストで返す。見出し行も1行目としてそのまま返る。

csv.DictReader

各行を辞書で返す。fieldnames を省略すると1行目を列名に使い、その行は結果に含めない。

共通する点

どちらも値は文字列のまま。数値への変換は自動では行われず、ファイルは newline='' を指定して開く。

違いを表で確認

比較軸csv.readercsv.DictReader
1行の型csv.reader:文字列のリスト(例:['Aki', '80'])csv.DictReader:辞書(例:{'name': 'Aki', 'score': '80'})。Python 3.8 以降は dict
見出し行csv.reader:特別扱いせず、1行目も通常の行として返すcsv.DictReader:fieldnames を省略すると1行目を列名に使い、結果から除く
値の取り出し方csv.reader:row[1] のように位置で取り出すcsv.DictReader:row['score'] のように列名で取り出す
列数が合わない行csv.reader:その行にある分だけのリストを返すcsv.DictReader:多い分は restkey(既定は None)のキーにリストで、少ない分は restval(既定は None)で埋める
値の型csv.reader:文字列のままcsv.DictReader:文字列のまま

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

csv.reader の結果に見出し行が混ざって困る人

csv.reader は1行目を見出しとして扱わないので、見出し行もリストの1つとして返ります。Python 3.9.6 で、1行目が name,score のデータを読むと、最初の要素が ['name', 'score'] になりました。見出し行を飛ばしたいときは、自分で1行読み飛ばします。

02

列の順番が変わっても動くようにしたい人

csv.DictReader は列名をキーにするので、row['score'] のように書けます。列の順番を位置で数える必要がなく、読みやすさの点で有利です。位置で取り出す csv.reader は、列が増えたり並びが変わったりするとずれます。

03

読み込んだ点数を足し算したら文字列がつながった人

どちらの読み方でも、数値は自動で変換されません。Python 3.9.6 で row['score'] の型を調べると str でした。計算するときは int() や float() で自分で変換します。

04

見出し行の無いCSVをDictReaderで読みたい人

fieldnames に列名の並びを渡すと、その名前を使い、1行目もデータとして結果に含まれます。見出し付きのCSVに fieldnames を渡すと、見出し行がデータの1行として返ってしまいます。

具体例で使い分ける

例 1

同じCSVを2通りで読んだ場合

name,score の見出しの下に、Aki,80 と Bo,75 の2行があるCSVです。

  • csv.reader:[['name', 'score'], ['Aki', '80'], ['Bo', '75']](見出し行も1行として入る)。
  • csv.DictReader:[{'name': 'Aki', 'score': '80'}, {'name': 'Bo', 'score': '75'}](見出し行は列名になり、データの2行だけが残る)。

結論: 同じファイルでも、見出し行の扱いと1行の型が変わります。値はどちらも文字列です。(Python 3.9.6 で実行)

例 2

fieldnames を渡した場合

見出し付きのCSVに、fieldnames=['name', 'score'] を渡して DictReader で読みます。

  • fieldnames を指定したので、その名前を列名に使います。
  • 1行目の name,score もデータとして結果に含まれ、{'name': 'name', 'score': 'score'} という行ができます。

結論: fieldnames を渡すと見出し行は読み飛ばされません。見出しがあるCSVでは、fieldnames を省略します。(Python 3.9.6 で実行)

例 3

列数がそろっていない行を読んだ場合

見出しが name,score で、データの1行目は Aki,80,extra(列が1つ多い)、2行目は Bo(列が1つ少ない)です。

  • 既定では、多い分は None をキーにしたリスト、少ない分は None が入ります。
  • 結果は {'name': 'Aki', 'score': '80', None: ['extra']} と {'name': 'Bo', 'score': None} になります。
  • restkey='rest'、restval='' を指定すると、{'rest': ['extra']} と {'score': ''} になります。

結論: 足りない値は restval、余った値は restkey で受けます。既定はどちらも None です。(Python 3.9.6 で実行)

問題文から答えを選ぶ手順

  1. 1

    取り出し方を決める

    位置(何番目の列か)で扱うなら csv.reader、列名で扱うなら csv.DictReader を選びます。

  2. 2

    見出し行の有無を見る

    見出し行があるCSVは、DictReader で fieldnames を省略します。見出しが無いCSVは fieldnames に列名を渡します。

  3. 3

    値の型を確かめる

    どちらも値は文字列です。数として使うときは int() や float() で変換します。

  4. 4

    ファイルの開き方を確かめる

    ファイルオブジェクトを渡すときは、open() に newline='' を指定します。

試験での見分け方

  • 1csv.reader は、各行を文字列のリストで返す。
  • 2csv.DictReader は、各行を辞書にマップして返す。fieldnames を省略すると1行目を列名に使い、その行は結果から除く。
  • 3fieldnames を指定すると、1行目もデータとして結果に含まれる。
  • 4どちらも値は文字列のままで、数値への自動変換は行われない。
  • 5ファイルオブジェクトを渡すときは、newline='' を指定して開く。

誤答しやすい選択肢

csv.reader が見出し行を自動で除くと考える

修正: csv.reader は見出し行も1行として返します。除くのは、fieldnames を省略した csv.DictReader の働きです。

読んだ数値をそのまま計算に使う

修正: csv の値は文字列で返ります。足し算の前に int() や float() で変換します。

見出し付きのCSVに fieldnames を渡す

修正: fieldnames を指定すると、1行目もデータとして結果に含まれます。見出し付きのCSVでは省略します。

DictReader の行は、いつも OrderedDict だと考える

修正: 返る行の型は Python 3.6 で OrderedDict、3.8 で dict に変わりました。現在の Python 3 では dict です。

確認問題

Q1csv.reader は、1行をどんな型で返しますか?

答え: 文字列のリスト

数値も含め、値はすべて文字列で返ります。

Q2csv.DictReader で fieldnames を省略すると、1行目はどう扱われますか?

答え: 列名に使われ、結果には含まれない

fieldnames を指定した場合は、1行目もデータとして結果に含まれます。

Q3DictReader で、行がフィールド名より多くの値を持つとき、余った値はどこに入りますか?

答え: restkey で指定したキー(既定は None)に、リストとして入る

少ない場合は、足りない値が restval(既定は None)で埋められます。

Q4csv で読んだ「80」は、そのまま整数として足し算できますか?

答え: できない(文字列なので int() などで変換する)

QUOTE_NONNUMERIC を指定した場合を除き、型の自動変換は行われません。

到達チェック

  • csv.reader と csv.DictReader が返す1行の型を言える
  • 見出し行の扱いが、fieldnames の有無でどう変わるか説明できる
  • restkey と restval の役割を説明できる
  • csv の値が文字列で返る点と、newline='' の指定を説明できる

同じ資格で次に知りたいこと

よくある質問

Qcsv.reader と csv.DictReader の違いは?

A

csv.reader は各行を文字列のリストで返し、csv.DictReader は各行を列名をキーにした辞書で返します。

QDictReader は見出し行をどう扱いますか?

A

fieldnames を省略すると、1行目の値を列名に使い、その行を結果から除きます。fieldnames を指定すると、1行目もデータとして含まれます。

Qcsv で読み込んだ数値は自動で数に変換されますか?

A

されません。QUOTE_NONNUMERIC を指定した場合を除き、値は文字列のままです。計算には int() や float() で変換します。

Qcsv モジュールは Python3 エンジニア認定基礎試験の範囲ですか?

A

このサイトの事実リストでは、csv は標準ライブラリの紹介(標準ライブラリめぐり)で挙がる名前です。reader と DictReader の細かな引数まで問われるとは確認できていないので、標準ライブラリの役割を知る補足として読んでください。

次に見る比較

執筆: AI資格ドリル編集部(運営者情報を見る)