2日目のゴール
2日目のテーマは
「列名でCSVを扱えるようになって、“実務っぽいデータ処理”に一歩踏み込むこと」 です。
1日目は「1行=リスト」として扱いましたが、
今日はここから一歩進んで、
列名でアクセスできる DictReader / DictWriter
「id」「name」「age」など“意味のあるキー”でデータを扱う感覚
簡単な集計・フィルタを“実務っぽく”書く
ここを狙っていきます。
行を「リスト」ではなく「辞書」として扱う
なぜ DictReader が便利なのか
1日目では、こういう読み方をしました。
import csv
with open("people.csv", "r", encoding="utf-8", newline="") as f:
reader = csv.reader(f)
header = next(reader)
for row in reader:
person_id, name, age_text = row
age = int(age_text)
PythonこれはこれでOKですが、
列が増えてくると「順番に依存する」のがつらくなります。
そこで登場するのが csv.DictReader です。
DictReader は、
「1行を辞書として返してくれる読み取り器」
です。
people.csv がこうだとします。
id,name,age
1,Taro,25
2,Hanako,30
3,Ken,22
これを DictReader で読むと、
1行目のヘッダーを「キー」として使い、
2行目以降を「辞書」として返してくれます。
DictReader の基本的な使い方
行を dict として受け取る
まずは、最小のサンプルから。
import csv
def read_csv_with_dictreader():
with open("people.csv", "r", encoding="utf-8", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
print(row)
read_csv_with_dictreader()
Python出力イメージはこうなります。
{'id': '1', 'name': 'Taro', 'age': '25'}
{'id': '2', 'name': 'Hanako', 'age': '30'}
{'id': '3', 'name': 'Ken', 'age': '22'}
ここで深掘りしたいポイントは三つです。
1行目のヘッダー id,name,age が、そのまま辞書のキーになっていること。
各行が「キー: 文字列」の辞書として返ってくること。csv.reader のときのように next(reader) でヘッダーを飛ばす必要がないこと。
つまり、
「列名でアクセスできるようになる」
というのが DictReader の一番の価値です。
列名でアクセスして、意味のあるコードにする
row[“age”] のように書ける気持ちよさ
さっきの row は、こんな辞書でした。
row = {"id": "1", "name": "Taro", "age": "25"}
Pythonこれを使って、
「25歳以上の人だけ表示する」コードを書いてみます。
import csv
def show_people_over_25():
with open("people.csv", "r", encoding="utf-8", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
age = int(row["age"])
if age >= 25:
print(f"ID={row['id']}, 名前={row['name']}, 年齢={age}")
Pythonここでの重要ポイントは、
row["age"] のように「列名でアクセスしている」こと。row["id"], row["name"] も同様に、意味のあるキーで取り出せること。
コードを読んだときに「何をしているか」がすぐ分かること。
1日目の row[0], row[1] よりも、
圧倒的に“実務コードっぽく”なっています。
DictWriter で「辞書からCSVを書く」
「キーの順番」を fieldnames で決める
読み込みに DictReader があるように、
書き込みには csv.DictWriter があります。
DictWriter は、
「辞書を受け取って、指定した列順でCSVに書いてくれる」
というものです。
まず、書き出したいデータを
「辞書のリスト」として用意します。
people = [
{"id": "1", "name": "Taro", "age": "25"},
{"id": "2", "name": "Hanako", "age": "30"},
{"id": "3", "name": "Ken", "age": "22"},
]
Pythonこれを output_people.csv に書き出します。
import csv
def write_csv_with_dictwriter():
people = [
{"id": "1", "name": "Taro", "age": "25"},
{"id": "2", "name": "Hanako", "age": "30"},
{"id": "3", "name": "Ken", "age": "22"},
]
fieldnames = ["id", "name", "age"]
with open("output_people.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for person in people:
writer.writerow(person)
print("output_people.csv に書き込みました。")
Pythonここで深掘りしたいポイントは四つです。
fieldnames で「列の順番と名前」を明示的に決めていること。csv.DictWriter(f, fieldnames=fieldnames) で「この列構成で書く」writer を作っていること。writer.writeheader() で「ヘッダー行(id,name,age)」を書いていること。writer.writerow(person) に「辞書」を渡すと、キーに対応する列に値が入ること。
つまり、
「辞書のキー=CSVの列名」
という対応関係を、はっきりさせて書いているわけです。
実務っぽいミニアプリ:CSVを読み、加工して、別CSVに出す
DictReader と DictWriter をつなげる
2日目の仕上げとして、
こんな処理をやってみます。
people.csv を読み込む
年齢に応じて「区分」を付ける(20代、30代など)people_with_group.csv に書き出す
まず、区分を決める関数を用意します。
def get_age_group(age):
if age < 20:
return "10代以下"
elif age < 30:
return "20代"
elif age < 40:
return "30代"
else:
return "40代以上"
Python次に、CSVの読み書きを組み合わせます。
import csv
def add_age_group(input_file, output_file):
with open(input_file, "r", encoding="utf-8", newline="") as f_in:
reader = csv.DictReader(f_in)
rows = []
for row in reader:
age = int(row["age"])
row["age_group"] = get_age_group(age)
rows.append(row)
fieldnames = ["id", "name", "age", "age_group"]
with open(output_file, "w", encoding="utf-8", newline="") as f_out:
writer = csv.DictWriter(f_out, fieldnames=fieldnames)
writer.writeheader()
for row in rows:
writer.writerow(row)
print(f"{output_file} に年齢区分付きのデータを書き出しました。")
def main():
add_age_group("people.csv", "people_with_group.csv")
main()
Pythonこのコードを、日本語だけで整理してみます。
入力CSVを DictReader で読み、1行ずつ辞書として受け取る。row["age"] を整数に変換し、get_age_group で区分を決める。row["age_group"] という新しいキーを追加する。
加工済みの行を rows にためておく。
出力CSVを DictWriter で開き、fieldnames で列順を決める。
ヘッダーを書き、rows の各辞書を writer.writerow で書き出す。
これで、
「CSVを読み込んで加工し、列を増やして別CSVに出す」
という、かなり実務寄りの処理が完成します。
2日目で絶対に押さえておきたいポイント
「列名で扱う」ことの圧倒的なメリット
今日の本質は、ここです。
csv.DictReader は「1行を辞書として返し、ヘッダーをキーにしてくれる」。row["列名"] でアクセスできるので、コードが読みやすく・壊れにくくなる。csv.DictWriter は「辞書を受け取り、fieldnames で決めた列順で書き出してくれる」。
ヘッダーは writer.writeheader() で自動的に書ける。
「読み込み(DictReader)→加工→書き出し(DictWriter)」が、実務データ処理の基本パターンになる。
3日目以降は、
ここに「集計」「ソート」「複数CSVの突き合わせ」などを足していきます。
でも土台は、今日のこれだけです。
「行を辞書として扱う」
「列名でアクセスする」
この感覚が入った瞬間、
CSVは一気に“仕事で使えるデータ”に変わります。

