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

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

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

7日目のテーマは 「6日間で積み上げてきた機能を“ひとつの完成アプリ”としてまとめ、変数・条件分岐・繰り返し・関数・ファイル操作を総復習しながらコード構造を理解すること」 です。

ここまでで家計簿アプリは、 登録・一覧表示・検索・並び替え・編集・削除・バックアップ・JSON保存 という、初級者が学ぶべき機能をすべて体験してきました。

7日目では、これらを 完成版家計簿アプリ(JSON版) として整理し、 「アプリの構造を理解しながら、どこをどう改善できるか」まで見えるようにします。

この段階に来た読者は、 もう 自分でアプリを育てられる人 です。

完成アプリの構造を理解する

家計簿アプリは、次のような構造でできています。

● データ構造(JSON)

  • 1件分の支出 → 辞書
  • 全体 → 辞書のリスト
  • 保存形式 → expenses.json

● 機能(関数)

  • 登録add_expense_json()
  • 一覧表示show_all_expenses_json()
  • 検索(項目・日付・金額)
  • 並び替え(項目順・金額順・日付順)
  • 編集edit_expense_json()
  • 削除delete_expense_json()
  • バックアップbackup_json()
  • 読み込み・保存load_expenses_json(), save_expenses_json()
  • メニュー表示show_menu()
  • アプリ全体の流れmain()

● アプリの流れ(main)

  • メニューを表示
  • ユーザーの選択を受け取る
  • 条件分岐で機能を呼び出す
  • while で繰り返す

この構造は、 どんなコンソールアプリでも応用できる基本パターン です。

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 → 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

深掘りポイント

  • indent=2 で読みやすい整形済みJSON
  • 日本語をそのまま保存するために ensure_ascii=False

支出登録機能(完成版)

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

支出一覧表示機能(完成版)

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

項目検索機能(完成版)

def search_by_item_json():
    keyword = input("検索したい項目(部分一致可): ")

    entries = load_expenses_json()

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

    print(f"=== 項目に「{keyword}」を含む支出 ===")
    found = False

    for e in entries:
        if keyword in e["item"]:
            print(f"項目: {e['item']}")
            print(f"金額: {e['amount']}")
            print(f"日付: {e['date']}")
            print("------------------------------")
            found = True

    if not found:
        print("該当する支出は見つかりませんでした。")
Python

日付検索機能(完成版)

def search_by_date_json():
    keyword = input("検索したい日付(例:2026-08-08): ")

    entries = load_expenses_json()

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

    print(f"=== 日付が「{keyword}」の支出 ===")
    found = False

    for e in entries:
        if keyword == e["date"]:
            print(f"項目: {e['item']}")
            print(f"金額: {e['amount']}")
            print(f"日付: {e['date']}")
            print("------------------------------")
            found = True

    if not found:
        print("該当する支出は見つかりませんでした。")
Python

金額検索機能(完成版)

def search_by_amount_json():
    keyword = input("検索したい金額: ")

    entries = load_expenses_json()

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

    print(f"=== 金額が「{keyword}」の支出 ===")
    found = False

    for e in entries:
        if e["amount"] == int(keyword):
            print(f"項目: {e['item']}")
            print(f"金額: {e['amount']}")
            print(f"日付: {e['date']}")
            print("------------------------------")
            found = True

    if not found:
        print("該当する支出は見つかりませんでした。")
Python

編集機能(完成版)

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

削除機能(完成版)

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

バックアップ機能(完成版)

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

メニュー(完成版)

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

main(完成版)

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

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

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

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

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

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

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

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

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

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

次のステップ(応用編への橋)

この家計簿アプリはまだまだ育てられます。

  • GUI版(画面付きアプリ)
  • SQLiteでデータベース化
  • Webアプリ化(Flask)
  • グラフ表示(matplotlib)

7日間の学習を終えた読者は、 もう Pythonで実用的なアプリを作れる人 です。

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