基礎から学ぶPython入門 90日コース | Python基礎 - Day 13:CSV・JSON

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

Day 13:CSV・JSONの基本を押さえる

Day 13では、「CSV」と「JSON」という、現実の開発現場で非常によく使われるデータ形式を扱います。 Pythonの標準ライブラリである csvjson を使って、読み込み・書き込みの流れをステップバイステップで体験しながら、 プログラミング初心者の方にも分かりやすい形で説明していきます。

CSVとは何かをイメージする

CSVのざっくりしたイメージ

CSVは「Comma Separated Values」の略で、「カンマ区切りの値」という意味です。 Excelなどでよく見かける「表形式のデータ」を、テキストファイルとして保存したものだと考えると分かりやすいです。

例えば、次のような内容がCSVです。

name,age,city
太郎,25,東京
花子,30,大阪
次郎,22,福岡
  • 1行目は「ヘッダー行」で、列の名前(項目名)が書かれています。
  • 2行目以降は「データ行」で、各行が1人分の情報を表しています。
  • 各行の中で、値がカンマ(,)で区切られています。

CSVは「表形式のデータ」を扱うのに向いていて、 Excelやスプレッドシートとの相性が良い形式です。

Pythonの csv モジュールでCSVを読み込む

Pythonには、CSVを扱うための標準ライブラリ csv が用意されています。 まずは、「CSVファイルを読み込んで、1行ずつ表示する」基本的な例を見ていきます。

import csv

# 読み込むCSVファイル名
CSV_FILE = "people.csv"

# people.csv の例:
# name,age,city
# 太郎,25,東京
# 花子,30,大阪
# 次郎,22,福岡

# CSVを読み込む基本形
with open(CSV_FILE, "r", encoding="utf-8", newline="") as f:
    reader = csv.reader(f)  # readerオブジェクトを作成

    for row in reader:
        # row は1行分のデータが入ったリストです
        print("1行分のデータ:", row)
Python

ここでのポイントは次の通りです。

  • import csv でCSVモジュールを読み込みます。
  • open() でファイルを開き、csv.reader(f) で「行ごとのリスト」を返すリーダーを作ります。
  • for row in reader: で、CSVの各行を順番に処理できます。
  • row はリストであり、row[0] が1列目、row[1] が2列目…という形でアクセスできます。

ヘッダー行をスキップしたい場合は、次のように書けます。

with open(CSV_FILE, "r", encoding="utf-8", newline="") as f:
    reader = csv.reader(f)

    header = next(reader)  # 1行目(ヘッダー)を読み飛ばす
    print("ヘッダー:", header)

    for row in reader:
        print("データ行:", row)
Python

csv.DictReader で「列名付き」で扱う

CSVを「列名付き」で扱いたい場合は、csv.DictReader を使うと便利です。

import csv

CSV_FILE = "people.csv"

with open(CSV_FILE, "r", encoding="utf-8", newline="") as f:
    reader = csv.DictReader(f)  # 1行目をヘッダーとして使う

    for row in reader:
        # row は「列名 → 値」の辞書になります
        name = row["name"]
        age = row["age"]
        city = row["city"]
        print(f"{name} さん({age}歳)は {city} 在住です。")
Python

ここでのポイントは次の通りです。

  • DictReader は、1行目のヘッダーを使って「列名付きの辞書」を返します。
  • row["name"] のように、「列名」で値にアクセスできるので読みやすくなります。
  • 列の順番に依存しないコードを書けるため、保守性が高くなります。

Pythonの csv モジュールでCSVを書き込む

次に、「PythonのデータをCSVファイルに書き込む」例を見ていきます。

csv.writer を使った書き込み

import csv

CSV_FILE = "people_output.csv"

# 書き込みたいデータ(リストのリスト)
data = [
    ["name", "age", "city"],  # ヘッダー行
    ["太郎", 25, "東京"],
    ["花子", 30, "大阪"],
    ["次郎", 22, "福岡"],
]

with open(CSV_FILE, "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)

    for row in data:
        writer.writerow(row)  # 1行分のリストを書き込みます

print("CSVファイルに書き込みました。")
Python

ポイントは次の通りです。

  • csv.writer(f) で「行を書き込むためのライター」を作ります。
  • writer.writerow(row) に「1行分のリスト」を渡すと、その行がCSVに書き込まれます。
  • newline="" を指定することで、改行コードの扱いを安定させています。

csv.DictWriter を使った書き込み

辞書のリストをCSVに書き込みたい場合は、csv.DictWriter が便利です。

import csv

CSV_FILE = "people_output_dict.csv"

# 書き込みたいデータ(辞書のリスト)
data = [
    {"name": "太郎", "age": 25, "city": "東京"},
    {"name": "花子", "age": 30, "city": "大阪"},
    {"name": "次郎", "age": 22, "city": "福岡"},
]

# 列名(ヘッダー)を定義します
fieldnames = ["name", "age", "city"]

with open(CSV_FILE, "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)

    writer.writeheader()  # ヘッダー行を書き込みます

    for row in data:
        writer.writerow(row)  # 辞書を1行として書き込みます

print("辞書形式のデータをCSVに書き込みました。")
Python

JSONとは何かをイメージする

JSONのざっくりしたイメージ

JSONは「JavaScript Object Notation」の略で、「データをテキストで表現するためのフォーマット」です。 Pythonの辞書やリストに非常によく似た構造を持っていて、Web APIや設定ファイルなどで広く使われています。

例えば、次のような内容がJSONです。

{
  "name": "太郎",
  "age": 25,
  "city": "東京",
  "languages": ["Python", "JavaScript"],
  "is_student": false
}
JSON
  • {} は「オブジェクト(辞書のようなもの)」を表します。
  • "key": value の形で「キーと値」が並びます。
  • [] は「配列(リストのようなもの)」を表します。
  • true / false は「真偽値」です(Pythonでは True / False)。

JSONは、「階層構造を持つデータ」を表現するのに向いていて、 設定情報やAPIレスポンスなどでよく使われます。

Pythonの json モジュールでJSONを読み込む

Pythonには、JSONを扱うための標準ライブラリ json が用意されています。 まずは、「JSONファイルを読み込んで、Pythonの辞書として扱う」基本的な例を見ていきます。

import json

JSON_FILE = "person.json"

# person.json の例:
# {
#   "name": "太郎",
#   "age": 25,
#   "city": "東京",
#   "languages": ["Python", "JavaScript"],
#   "is_student": false
# }

with open(JSON_FILE, "r", encoding="utf-8") as f:
    data = json.load(f)  # JSONをPythonのオブジェクトに変換します

# data は辞書として扱えます
print("名前:", data["name"])
print("年齢:", data["age"])
print("都市:", data["city"])
print("言語リスト:", data["languages"])
print("学生かどうか:", data["is_student"])
Python

ここでのポイントは次の通りです。

  • json.load(f) は、「ファイルからJSONを読み込み、Pythonのオブジェクト(辞書やリスト)に変換する」関数です。
  • JSONのオブジェクトはPythonの辞書に、配列はリストに対応します。
  • そのため、data["name"] のように辞書として自然に扱えます。

文字列としてJSONを扱いたい場合は、json.loads()(sが付く)を使います。

import json

json_text = '{"name": "太郎", "age": 25}'

data = json.loads(json_text)  # 文字列からJSONを読み込みます
print(data["name"])
print(data["age"])
Python

Pythonの json モジュールでJSONを書き込む

次に、「Pythonの辞書やリストをJSONファイルに書き込む」例を見ていきます。

import json

JSON_FILE = "person_output.json"

data = {
    "name": "太郎",
    "age": 25,
    "city": "東京",
    "languages": ["Python", "JavaScript"],
    "is_student": False,
}

with open(JSON_FILE, "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

print("JSONファイルに書き込みました。")
Python

ここでのポイントは次の通りです。

  • json.dump(data, f, ...) は、「PythonのオブジェクトをJSONとしてファイルに書き込む」関数です。
  • ensure_ascii=False を指定すると、日本語がそのままの形で書き込まれます(エスケープされません)。
  • indent=2 を指定すると、インデント付きで読みやすい整形済みJSONになります。

文字列としてJSONを書き出したい場合は、json.dumps()(sが付く)を使います。

import json

data = {"name": "太郎", "age": 25}

json_text = json.dumps(data, ensure_ascii=False, indent=2)
print(json_text)
Python

CSVとJSONの違いをざっくり整理する

最後に、CSVとJSONの違いをざっくり整理しておきます。

  • CSV:
    • 表形式(行と列)のデータに向いています。
    • Excelやスプレッドシートとの相性が良いです。
    • 構造はシンプルですが、階層構造を表現するのは苦手です。
  • JSON:
    • 辞書やリストのような階層構造を持つデータに向いています。
    • Web APIや設定ファイルなどで広く使われています。
    • 人間にも比較的読みやすく、機械にも扱いやすい形式です。

Pythonでは、csvjson の両方が標準ライブラリとして用意されているため、 「表形式のデータはCSV」「階層構造のデータはJSON」という使い分けを自然に行うことができます。

Day 13のまとめ

Day 13では、CSV・JSONを通して、

  • CSVとは何か、どんな場面に向いているか
  • csv.readercsv.writercsv.DictReadercsv.DictWriter を使った読み書きの基本
  • JSONとは何か、どんな場面に向いているか
  • json.loadjson.dumpjson.loadsjson.dumps を使った読み書きの基本
  • 日本語を扱うときの文字コードや ensure_ascii=False の重要性

をステップバイステップで見てきました。

ここまで来ると、「Pythonで外部データとやり取りする」という感覚がかなり具体的になっているはずです。 この感覚は、今後の90日間で触れるWeb API、設定ファイル、ログ解析など、より実践的なテーマにとって大きな土台になっていきます。


Day 13:CSV・JSONで「CSV住所録」を作る

Day 13の制作編では、「CSV住所録」を題材にして、CSVとJSONの読み込み・書き込みを体験していきます。 Excelのような表形式のデータをCSVで扱い、設定やバックアップ用にJSONも使えるようになることを目標にします。 プログラミング初心者の方にも分かりやすいように、ステップバイステップで解説していきます。

CSV住所録の全体イメージ

まず、「CSV住所録でやりたいこと」を整理します。

  • 住所録をCSVファイルとして保存する
  • 1人分の情報(名前・メールアドレス・住所など)を1行として扱う
  • 住所録を読み込んで一覧表示する
  • 新しい人を住所録に追加してCSVに書き込む

この流れの中で、csv モジュールによる読み込み・書き込みを自然に使っていきます。 さらに、JSONを使って「住所録の設定」や「バックアップ」を扱うイメージも少し触れていきます。

CSVとは何かを住所録の文脈で理解する

CSVの基本イメージ

CSV(Comma Separated Values)は、「カンマ区切りの値」という意味で、 表形式のデータをテキストファイルとして保存するためのフォーマットです。

住所録をCSVで表現すると、例えば次のようになります。

name,email,address
山田太郎,taro@example.com,東京都渋谷区
鈴木花子,hanako@example.com,大阪府大阪市
佐藤次郎,jiro@example.com,福岡県福岡市
  • 1行目は「ヘッダー行」で、列の名前(項目名)が書かれています。
  • 2行目以降は「データ行」で、各行が1人分の住所録情報を表しています。
  • 各行の中で、値がカンマ(,)で区切られています。

CSV住所録では、「1行=1人」「1列=項目(名前・メール・住所など)」というイメージで扱います。

Pythonの csv モジュールでCSV住所録を読み込む

住所録CSVを読み込んで、一覧表示するところから始めます。 ここでは、csv.DictReader を使って「列名付き」で扱う方法を採用します。

import csv

CSV_FILE = "address_book.csv"  # 住所録CSVファイル名


def show_address_book():
    """CSV住所録を読み込んで一覧表示する関数です。"""
    try:
        with open(CSV_FILE, "r", encoding="utf-8", newline="") as f:
            reader = csv.DictReader(f)  # 1行目をヘッダーとして使います

            print("▼ 住所録一覧")
            print("--------------------")
            for row in reader:
                # row は「列名 → 値」の辞書です
                name = row.get("name", "")
                email = row.get("email", "")
                address = row.get("address", "")
                print(f"名前: {name}")
                print(f"メール: {email}")
                print(f"住所: {address}")
                print("--------------------")
    except FileNotFoundError:
        print("住所録ファイルがまだ存在しません。先に登録を行ってください。")
Python

ここでのポイントは次の通りです。

  • csv.DictReader(f) は、1行目のヘッダーを使って「列名付きの辞書」を返します。
  • row["name"] のように、「列名」で値にアクセスできるため、コードが読みやすくなります。
  • get("name", "") のように get() を使うと、「列が存在しない場合でも空文字を返す」ので安全です。
  • FileNotFoundError を捕まえることで、「住所録がまだない場合」に丁寧なメッセージを出せます。

CSV住所録に新しい人を追加する(追記)

次に、「新しい人を住所録に追加する」機能を作ります。 ここでは、csv.DictWriter を使って、辞書形式のデータをCSVに書き込みます。

import csv

CSV_FILE = "address_book.csv"


def add_person():
    """住所録に新しい人を追加する関数です。"""
    print("新しく登録する人の情報を入力してください。")

    name = input("名前: ")
    email = input("メールアドレス: ")
    address = input("住所: ")

    # 入力された情報を辞書にまとめます
    person = {
        "name": name,
        "email": email,
        "address": address,
    }

    # 住所録ファイルが存在するかどうかを確認します
    file_exists = False
    try:
        with open(CSV_FILE, "r", encoding="utf-8", newline="") as f:
            file_exists = True
    except FileNotFoundError:
        file_exists = False

    # 追記モードで開きます
    with open(CSV_FILE, "a", encoding="utf-8", newline="") as f:
        fieldnames = ["name", "email", "address"]
        writer = csv.DictWriter(f, fieldnames=fieldnames)

        # ファイルがまだ存在しなかった場合はヘッダーを書き込みます
        if not file_exists:
            writer.writeheader()

        # 新しい人の情報を書き込みます
        writer.writerow(person)

    print("住所録に新しい人を追加しました。")
Python

ポイントは次の通りです。

  • csv.DictWriter(f, fieldnames=...) で「列名付きのライター」を作ります。
  • 初回だけ writer.writeheader() でヘッダー行を書き込みます。
  • 追記モード "a" を使うことで、「既存の住所録に行を追加」できます。
  • ファイルの存在チェックをして、「初回だけヘッダーを書く」ようにしています。

この関数により、「住所録がまだない場合は新規作成」「既にある場合は追記」という自然な動きになります。

CSV住所録を新規作成・上書きする

場合によっては、「住所録を一度リセットして、新しい内容で上書きしたい」ということもあります。 ここでは、リストのリストを使って、住所録を丸ごと上書きする例を示します。

import csv

CSV_FILE = "address_book.csv"


def overwrite_address_book():
    """住所録を新しく作り直す(上書き保存する)関数です。"""
    print("住所録を新しく作り直します。")
    print("既存の内容はすべて上書きされます。")

    people = []

    while True:
        print("\n新しく登録する人の情報を入力してください。")
        name = input("名前(空行で終了): ")
        if name == "":
            break
        email = input("メールアドレス: ")
        address = input("住所: ")

        people.append([name, email, address])

    if not people:
        print("1人も登録されなかったため、住所録は変更されませんでした。")
        return

    # 上書きモードでCSVを書き込みます
    with open(CSV_FILE, "w", encoding="utf-8", newline="") as f:
        writer = csv.writer(f)

        # ヘッダー行を書き込みます
        writer.writerow(["name", "email", "address"])

        # 各人の情報を書き込みます
        for person in people:
            writer.writerow(person)

    print("住所録を新しい内容で上書き保存しました。")
Python

ここでは、

  • csv.writer を使って「リストのリスト」をCSVに書き込んでいます。
  • "w" モードで開くことで、「既存の住所録を上書き」しています。
  • ヘッダー行を最初に書き、その後に各人の行を続けています。

JSONとは何かを住所録の文脈で理解する

CSV住所録ができたところで、JSONにも触れておきます。 JSONは、「階層構造を持つデータ」をテキストで表現するフォーマットで、 住所録の「設定」や「バックアップ」に向いています。

例えば、住所録の設定をJSONで表現すると次のようになります。

{
  "file_name": "address_book.csv",
  "backup_file": "address_book_backup.json",
  "fields": ["name", "email", "address"]
}
JSON
  • file_name は住所録CSVのファイル名
  • backup_file はバックアップJSONのファイル名
  • fields は住所録の項目名のリスト

このように、JSONは「設定情報」や「構造化されたデータ」を扱うのに向いています。

Pythonの json モジュールで住所録をJSONバックアップする

CSV住所録をJSON形式でバックアップする例を見ていきます。 ここでは、「CSVを読み込んで、JSONファイルに書き出す」流れを作ります。

import csv
import json

CSV_FILE = "address_book.csv"
JSON_BACKUP_FILE = "address_book_backup.json"


def backup_address_book_to_json():
    """CSV住所録をJSON形式でバックアップする関数です。"""
    try:
        with open(CSV_FILE, "r", encoding="utf-8", newline="") as f:
            reader = csv.DictReader(f)
            people = list(reader)  # 住所録全体をリストにします

        # people は「1人分の情報が入った辞書」のリストになります
        backup_data = {
            "count": len(people),
            "people": people,
        }

        with open(JSON_BACKUP_FILE, "w", encoding="utf-8") as jf:
            json.dump(backup_data, jf, ensure_ascii=False, indent=2)

        print("住所録をJSON形式でバックアップしました。")

    except FileNotFoundError:
        print("住所録CSVが存在しないため、バックアップできませんでした。")
Python

ポイントは次の通りです。

  • csv.DictReader でCSV住所録を「辞書のリスト」として読み込みます。
  • backup_data に「人数」と「人のリスト」をまとめてJSONに書き出します。
  • json.dump(..., ensure_ascii=False, indent=2) で、日本語をそのまま・読みやすい整形済みJSONとして保存します。

このように、CSVとJSONを組み合わせることで、「表形式の住所録」と「構造化されたバックアップ」の両方を扱えるようになります。

CSV住所録アプリの全体テンプレート

最後に、ここまでの機能をまとめた「CSV住所録アプリ」のテンプレートを示します。

import csv
import json

CSV_FILE = "address_book.csv"
JSON_BACKUP_FILE = "address_book_backup.json"


def show_address_book():
    """住所録を一覧表示します。"""
    try:
        with open(CSV_FILE, "r", encoding="utf-8", newline="") as f:
            reader = csv.DictReader(f)

            print("\n▼ 住所録一覧")
            print("--------------------")
            empty = True
            for row in reader:
                empty = False
                name = row.get("name", "")
                email = row.get("email", "")
                address = row.get("address", "")
                print(f"名前: {name}")
                print(f"メール: {email}")
                print(f"住所: {address}")
                print("--------------------")

            if empty:
                print("住所録は存在しますが、登録されている人がいません。")

    except FileNotFoundError:
        print("住所録ファイルがまだ存在しません。先に登録を行ってください。")


def add_person():
    """住所録に新しい人を追加します。"""
    print("\n新しく登録する人の情報を入力してください。")
    name = input("名前: ")
    email = input("メールアドレス: ")
    address = input("住所: ")

    if not name:
        print("名前が空のため、登録をキャンセルしました。")
        return

    person = {
        "name": name,
        "email": email,
        "address": address,
    }

    file_exists = False
    try:
        with open(CSV_FILE, "r", encoding="utf-8", newline="") as f:
            file_exists = True
    except FileNotFoundError:
        file_exists = False

    with open(CSV_FILE, "a", encoding="utf-8", newline="") as f:
        fieldnames = ["name", "email", "address"]
        writer = csv.DictWriter(f, fieldnames=fieldnames)

        if not file_exists:
            writer.writeheader()

        writer.writerow(person)

    print("住所録に新しい人を追加しました。")


def backup_address_book_to_json():
    """住所録をJSON形式でバックアップします。"""
    try:
        with open(CSV_FILE, "r", encoding="utf-8", newline="") as f:
            reader = csv.DictReader(f)
            people = list(reader)

        backup_data = {
            "count": len(people),
            "people": people,
        }

        with open(JSON_BACKUP_FILE, "w", encoding="utf-8") as jf:
            json.dump(backup_data, jf, ensure_ascii=False, indent=2)

        print("住所録をJSON形式でバックアップしました。")

    except FileNotFoundError:
        print("住所録CSVが存在しないため、バックアップできませんでした。")


def main():
    """CSV住所録アプリのメイン関数です。"""
    while True:
        print("\n=== CSV住所録アプリ ===")
        print("1: 住所録を表示する")
        print("2: 新しい人を追加する")
        print("3: 住所録をJSONにバックアップする")
        print("4: 終了する")

        choice = input("番号を入力してください: ")

        if choice == "1":
            show_address_book()
        elif choice == "2":
            add_person()
        elif choice == "3":
            backup_address_book_to_json()
        elif choice == "4":
            print("CSV住所録アプリを終了します。")
            break
        else:
            print("1〜4の番号を入力してください。")


if __name__ == "__main__":
    main()
Python

Day 13(制作編)のまとめ

Day 13の制作編では、「CSV住所録」を通して、

  • CSVとは何か、住所録のような表形式データに向いている理由
  • csv.DictReadercsv.DictWriter を使った「列名付き」の読み書き
  • "r""w""a" モードの使い分けと、住所録への追記・上書きの流れ
  • JSONとは何か、住所録の設定やバックアップに向いている理由
  • json.dump を使った「CSV住所録のJSONバックアップ」

をステップバイステップで体験していただきました。

ここまで来ると、「Pythonで外部データ(CSV・JSON)とやり取りしながら、実用的な住所録アプリを作る」という感覚がかなり具体的になっているはずです。 この感覚は、今後の90日間で触れるデータ分析・Web API・設定管理など、より実践的なテーマにとって大きな土台になっていきます。

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