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

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

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

5日目のテーマは 「家計簿データを“編集・削除できるアプリ”へ進化させ、変数・条件分岐・繰り返し・関数・ファイル操作を総復習すること」 です。

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

  • 支出の登録
  • 一覧表示
  • 項目・日付・金額で検索
  • 並び替え(項目順・金額順・日付順)

という「探せて整理できる家計簿アプリ」になりました。

5日目ではここに 編集機能・削除機能・バックアップ機能 を追加し、 「家計簿を管理できるアプリ」へ育てていきます。

このステップは、 読み込む → 加工する → 保存し直す というファイル操作の本質を理解する絶好の機会です。

家計簿データは「辞書のリスト」で扱う

4日目で作った load_expense_entries() を再利用します。 これは kakeibo.txt を読み込んで、 1件分の支出を辞書にまとめたリストとして返す関数でした。

この構造が編集・削除にとても便利です。

辞書のリストをファイルに書き戻す関数

編集・削除後は、 全データをファイルに上書き保存する必要があります。

def save_expense_entries(entries):
    """
    entries(辞書のリスト)を kakeibo.txt に上書き保存する
    """
    with open("kakeibo.txt", "w", encoding="utf-8") as f:
        for e in entries:
            f.write("==== 支出 ====\n")
            f.write(f"項目: {e['item']}\n")
            f.write(f"金額: {e['amount']}\n")
            f.write(f"日付: {e['date']}\n")
            f.write("\n")
Python

深掘りポイント

  • "w" → 上書きモード
  • 辞書のリストをループで回して書き込む
  • 保存形式はこれまでと同じなので、検索・並び替えもそのまま動く

支出を編集する機能

編集機能では、 指定した項目の支出を探して、金額や日付を変更できるようにします。

def edit_expense():
    """
    指定した項目の支出を編集する機能
    """
    target_item = input("編集したい支出項目を入力してください: ")

    entries = load_expense_entries()

    if not entries:
        return

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

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

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

            save_expense_entries(entries)
            print("支出を編集しました。")
            return

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

深掘りポイント

  • 編集とは「辞書の中身を書き換えること」
  • 空文字なら変更しないように strip() でチェック
  • 見つかったら即保存して終了

支出を削除する機能

削除機能では、 指定した項目の支出をリストから取り除き、ファイルに書き戻します。

def delete_expense():
    """
    指定した項目の支出を削除する機能
    """
    target_item = input("削除したい支出項目を入力してください: ")

    entries = load_expense_entries()

    if not entries:
        return

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

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

    save_expense_entries(new_entries)
    print("支出を削除しました。")
Python

深掘りポイント

  • 削除とは「残したいものだけ新しいリストに集めること」
  • リスト内包表記が非常に強力
  • 削除前後のリストの長さで「削除できたか」を判定

バックアップ機能

編集・削除をするようになると、 「間違えて消したらどうしよう」という不安が出てきます。

そこで、簡単なバックアップ機能を追加します。

def backup_kakeibo():
    """
    kakeibo.txt をそのままバックアップファイルにコピーする機能
    """
    try:
        with open("kakeibo.txt", "r", encoding="utf-8") as f:
            data = f.read()

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

        print("バックアップを作成しました。(kakeibo_backup.txt)")
    except FileNotFoundError:
        print("まだ支出がありません。バックアップする前に登録してみましょう。")
Python

深掘りポイント

  • 「読み込み → 書き込み」でファイルを丸ごとコピー
  • 実用的なアプリでは必須の安全機能

メニューに編集・削除・バックアップを追加する

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

main に編集・削除・バックアップ機能を組み込む

def main():
    print("Python 家計簿アプリ 5日目")
    print("支出を登録・表示・検索・並び替え・編集・削除・バックアップできるようにします。")

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

        if choice == "1":
            add_expense()
        elif choice == "2":
            show_all_expenses()
        elif choice == "3":
            search_by_item()
        elif choice == "4":
            search_by_date()
        elif choice == "5":
            search_by_amount()
        elif choice == "6":
            sort_by_item()
        elif choice == "7":
            sort_by_amount()
        elif choice == "8":
            sort_by_date()
        elif choice == "9":
            edit_expense()
        elif choice == "10":
            delete_expense()
        elif choice == "11":
            backup_kakeibo()
        elif choice == "12":
            print("家計簿アプリを終了します。おつかれさまでした。")
            break
        else:
            print("1〜12 のいずれかを入力してください。")
Python

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

● 編集・削除は「読み込む → 加工する → 保存し直す」

家計簿だけでなく、 住所録・連絡先・タスク管理など、 あらゆるデータ管理アプリで使われる基本パターンです。

● リスト内包表記は削除に強い

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

この一行で「削除したいもの以外を残す」処理が書けるのは、Pythonの大きな武器です。

● 関数を増やすことでアプリが“部品の集合”として見えてくる

編集・削除・バックアップが加わると、 アプリの構造がより明確になります。

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

6日目では、家計簿アプリをさらに進化させて、

  • JSON形式で保存する
  • データ構造をより扱いやすくする
  • 編集・削除・検索・並び替えをよりシンプルに書けるようにする

という「実用的な家計簿アプリ」へ進みます。

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