用語比較
csv.reader と csv.DictReader の違い|行をリストで読むか、辞書で読むか(Python3基礎)
どちらもCSVファイルを1行ずつ読むための仕組みです。違いは、1行を「文字列のリスト」で受け取るか、「列名をキーにした辞書」で受け取るかです。
何番目の列かで扱うなら reader、列名で扱うなら DictReaderと覚えると、使い分けを整理できます。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。
csv.readerとcsv.DictReaderの要点
csv.reader
各行を文字列のリストで返す。見出し行も1行目としてそのまま返る。
csv.DictReader
各行を辞書で返す。fieldnames を省略すると1行目を列名に使い、その行は結果に含めない。
共通する点
どちらも値は文字列のまま。数値への変換は自動では行われず、ファイルは newline='' を指定して開く。
違いを表で確認
| 比較軸 | csv.reader | csv.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どこで迷っているかを切り分ける
csv.reader の結果に見出し行が混ざって困る人
csv.reader は1行目を見出しとして扱わないので、見出し行もリストの1つとして返ります。Python 3.9.6 で、1行目が name,score のデータを読むと、最初の要素が ['name', 'score'] になりました。見出し行を飛ばしたいときは、自分で1行読み飛ばします。
列の順番が変わっても動くようにしたい人
csv.DictReader は列名をキーにするので、row['score'] のように書けます。列の順番を位置で数える必要がなく、読みやすさの点で有利です。位置で取り出す csv.reader は、列が増えたり並びが変わったりするとずれます。
読み込んだ点数を足し算したら文字列がつながった人
どちらの読み方でも、数値は自動で変換されません。Python 3.9.6 で row['score'] の型を調べると str でした。計算するときは int() や float() で自分で変換します。
見出し行の無い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
取り出し方を決める
位置(何番目の列か)で扱うなら csv.reader、列名で扱うなら csv.DictReader を選びます。
- 2
見出し行の有無を見る
見出し行があるCSVは、DictReader で fieldnames を省略します。見出しが無いCSVは fieldnames に列名を渡します。
- 3
値の型を確かめる
どちらも値は文字列です。数として使うときは int() や float() で変換します。
- 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='' の指定を説明できる
関連ページで確認する
同じ資格で次に知りたいこと
- timeitとprofileの違い|小さなコード片の比較か、ボトルネックの特定か(Python3基礎)
timeitモジュールとprofile・pstatsモジュールの違いを、計測する単位と目的で整理します。Python公式チュートリアル10.10の記述、タプルの入れ替えの計測例、確認問題つき。
- sys.exit() と exit() の違い|スクリプトの終了にどちらを書くか(Python3基礎)
sys.exit() と exit() の違いを、公式ドキュメントの説明(exit は site モジュールが追加する対話用の名前)、SystemExit 例外・finally 節・終了コードの扱い、Python 3.9.6 の実行結果で整理します。Python3エンジニア認定基礎試験の sys.exit() の理解に役立ちます。
- match文とif-elif-elseの違い|同じ値を複数の定数と比べるときの使い分け(Python3基礎)
match文とif-elif-elseの違いを、比べ方・どれにも当てはまらない場合・値の取り出しで整理します。Python公式チュートリアル4.1と4.7の記述、case _ とelseの対応、確認問題つき。
よくある質問
Qcsv.reader と csv.DictReader の違いは?
csv.reader は各行を文字列のリストで返し、csv.DictReader は各行を列名をキーにした辞書で返します。
QDictReader は見出し行をどう扱いますか?
fieldnames を省略すると、1行目の値を列名に使い、その行を結果から除きます。fieldnames を指定すると、1行目もデータとして含まれます。
Qcsv で読み込んだ数値は自動で数に変換されますか?
されません。QUOTE_NONNUMERIC を指定した場合を除き、値は文字列のままです。計算には int() や float() で変換します。
Qcsv モジュールは Python3 エンジニア認定基礎試験の範囲ですか?
このサイトの事実リストでは、csv は標準ライブラリの紹介(標準ライブラリめぐり)で挙がる名前です。reader と DictReader の細かな引数まで問われるとは確認できていないので、標準ライブラリの役割を知る補足として読んでください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: AI資格ドリル編集部(運営者情報を見る)
