Python | 1 日 60 分 × 7 日アプリ学習:Python文法を学ぶアプリ 家計簿編

Web APP SQL
スポンサーリンク
スポンサーリンク

家計簿アプリ 6日目のゴール

6日目のテーマは 「家計簿データを“JSON形式”で保存し、より扱いやすく安全なデータ構造へ進化させること」 です。

ここまでで家計簿アプリは、

  • 支出の登録
  • 一覧表示
  • 項目・日付・金額で検索
  • 並び替え
  • 編集・削除
  • バックアップ

という「テキストファイルで動く家計簿アプリ」になりました。

しかし、テキストファイルには弱点があります。

  • データ構造が複雑になると扱いづらい
  • 編集・削除時に書き戻しが大変
  • パターン解析が必要でコードが長くなる

そこで 6日目では、 JSON形式で家計簿データを保存し、辞書+リストのまま扱えるアプリへ進化させます。

このステップは、 変数・条件分岐・繰り返し・関数・ファイル操作 を総復習しながら、アプリの構造を一段レベルアップさせる重要な日です。

JSONとは何か(初心者向けにかみ砕いて)

JSON(JavaScript Object Notation)は 「辞書やリストをそのまま保存できるファイル形式」 です。

Pythonの辞書やリストはそのままでは保存できませんが、 JSONに変換すると保存できます。

例:

{
  "item": "食費",
  "amount": 1200,
  "date": "2026-08-08"
}

これは Python の辞書とほぼ同じ形です。

JSONのメリット

  • 辞書やリストをそのまま保存できる
  • 読み込むときも辞書やリストのまま使える
  • 編集・削除が簡単になる
  • 他の言語でも読みやすい

家計簿のような「データ管理アプリ」と相性抜群です。

今日やることの全体像

6日目では次の3つを実装します。

  • JSONで家計簿データを保存する
  • JSONから家計簿データを読み込む
  • 既存の機能を JSON 版に置き換える

これにより、家計簿アプリは 「テキスト解析が不要なデータ管理アプリ」へ進化します。

JSONを扱うためのモジュール:json

Pythonには標準で json モジュールがあります。

  • json.dump() → 辞書やリストを JSONファイルに保存
  • json.load() → JSONファイルを辞書やリストとして読み込む

この2つを使うだけで、 データ構造をそのまま保存・読み込みできます。

JSON版:家計簿データを読み込む関数

import json

def load_expenses_json():
    """
    expenses.json を読み込んで、辞書のリストとして返す関数
    """
    try:
        with open("expenses.json", "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return []  # ファイルがない場合は空リスト
Python

深掘りポイント

  • json.load() → JSON → Pythonの辞書・リスト
  • ファイルがないときは空リストを返すことでアプリが落ちない
  • テキスト解析が不要になるのでコードが短くなる

JSON版:家計簿データを保存する関数

def save_expenses_json(entries):
    """
    entries(辞書のリスト)を expenses.json に保存する
    """
    with open("expenses.json", "w", encoding="utf-8") as f:
        json.dump(entries, f, ensure_ascii=False, indent=2)
Python

深掘りポイント

  • json.dump() → Pythonの辞書・リスト → JSON
  • indent=2 で読みやすい整形済みJSONにする
  • 日本語をそのまま保存するために ensure_ascii=False を使う

JSON版:支出を登録する機能

def add_expense_json():
    item = input("支出項目: ")
    amount = input("金額: ")
    date = input("日付(例:2026-08-08): ")

    entries = load_expenses_json()

    new_entry = {
        "item": item,
        "amount": int(amount),  # 金額は数値として扱う
        "date": date
    }

    entries.append(new_entry)
    save_expenses_json(entries)

    print("支出を保存しました。(expenses.json)")
Python

JSON版:支出一覧表示機能

def show_all_expenses_json():
    entries = load_expenses_json()

    if not entries:
        print("まだ支出がありません。")
        return

    print("=== 支出一覧 ===")
    for e in entries:
        print(f"項目: {e['item']}")
        print(f"金額: {e['amount']}")
        print(f"日付: {e['date']}")
        print("------------------------------")
Python

JSON版:支出編集機能

def edit_expense_json():
    target_item = input("編集したい支出項目を入力してください: ")

    entries = load_expenses_json()

    for e in entries:
        if e["item"] == target_item:
            print("=== 現在の内容 ===")
            print(f"項目: {e['item']}")
            print(f"金額: {e['amount']}")
            print(f"日付: {e['date']}")

            new_amount = input("新しい金額(空なら変更なし): ")
            new_date = input("新しい日付(空なら変更なし): ")

            if new_amount.strip():
                e["amount"] = int(new_amount)
            if new_date.strip():
                e["date"] = new_date

            save_expenses_json(entries)
            print("編集しました。")
            return

    print("その項目の支出は見つかりませんでした。")
Python

JSON版:支出削除機能

def delete_expense_json():
    target_item = input("削除したい支出項目を入力してください: ")

    entries = load_expenses_json()

    new_entries = [e for e in entries if e["item"] != target_item]

    if len(new_entries) == len(entries):
        print("その項目の支出は見つかりませんでした。")
        return

    save_expenses_json(new_entries)
    print("削除しました。")
Python

JSON版:バックアップ機能

def backup_json():
    try:
        with open("expenses.json", "r", encoding="utf-8") as f:
            data = f.read()

        with open("expenses_backup.json", "w", encoding="utf-8") as bf:
            bf.write(data)

        print("バックアップを作成しました。(expenses_backup.json)")
    except FileNotFoundError:
        print("まだ支出がありません。")
Python

メニュー(JSON版)

def show_menu():
    print("------------------------------")
    print("Python 家計簿アプリ 6日目 メニュー")
    print("1: 支出を登録する(JSON)")
    print("2: 支出を一覧表示する(JSON)")
    print("3: 支出を編集する(JSON)")
    print("4: 支出を削除する(JSON)")
    print("5: バックアップを作成する(JSON)")
    print("6: 終了する")
    print("------------------------------")
Python

main(JSON版)

def main():
    print("Python 家計簿アプリ 6日目")
    print("JSON形式で家計簿を管理する完成版アプリです。")

    while True:
        show_menu()
        choice = input("番号を入力してください(1〜6): ")

        if choice == "1":
            add_expense_json()
        elif choice == "2":
            show_all_expenses_json()
        elif choice == "3":
            edit_expense_json()
        elif choice == "4":
            delete_expense_json()
        elif choice == "5":
            backup_json()
        elif choice == "6":
            print("終了します。")
            break
        else:
            print("1〜6 を入力してください。")
Python

6日目で本当に掴んでほしいこと

● JSONは「辞書とリストをそのまま保存できる魔法の箱」

テキスト解析が不要になり、 データ管理が圧倒的に楽になります。

● アプリは「メインループ+機能の集合」でできている

この構造を理解すると、 どんなコンソールアプリでも作れるようになります。

● 関数を分けることでアプリが整理される

機能ごとに分けることで、 アプリが「部品の集合」として理解しやすくなります。

次のステップ(7日目の予告)

7日目では、 家計簿アプリを完成版として整理し、構造を最終調整する というステップへ進みます。

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