家計簿アプリ 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("------------------------------")
Pythonmain に編集・削除・バックアップ機能を組み込む
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 のいずれかを入力してください。")
Python5日目で本当に掴んでほしいこと
● 編集・削除は「読み込む → 加工する → 保存し直す」
家計簿だけでなく、 住所録・連絡先・タスク管理など、 あらゆるデータ管理アプリで使われる基本パターンです。
● リスト内包表記は削除に強い
new_entries = [e for e in entries if e["item"] != target_item]
Pythonこの一行で「削除したいもの以外を残す」処理が書けるのは、Pythonの大きな武器です。
● 関数を増やすことでアプリが“部品の集合”として見えてくる
編集・削除・バックアップが加わると、 アプリの構造がより明確になります。
次のステップ(6日目の予告)
6日目では、家計簿アプリをさらに進化させて、
- JSON形式で保存する
- データ構造をより扱いやすくする
- 編集・削除・検索・並び替えをよりシンプルに書けるようにする
という「実用的な家計簿アプリ」へ進みます。


