Python | 1 日 120 分 × 7 日アプリ学習:CSVファイル読み書きアプリ(中級編)

Web APP Python
スポンサーリンク

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は一気に“仕事で使えるデータ”に変わります。

タイトルとURLをコピーしました