家計簿アプリ 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("------------------------------")
Pythonmain(完成版)
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 を入力してください。")
Python7日目で本当に掴んでほしいこと
● JSONは「辞書とリストをそのまま保存できる魔法の箱」
テキスト解析が不要になり、 データ管理が圧倒的に楽になります。
● アプリは「メインループ+機能の集合」でできている
この構造を理解すると、 どんなコンソールアプリでも作れるようになります。
● 関数を分けることでアプリが整理される
機能ごとに分けることで、 アプリが「部品の集合」として理解しやすくなります。
次のステップ(応用編への橋)
この家計簿アプリはまだまだ育てられます。
- GUI版(画面付きアプリ)
- SQLiteでデータベース化
- Webアプリ化(Flask)
- グラフ表示(matplotlib)
7日間の学習を終えた読者は、 もう Pythonで実用的なアプリを作れる人 です。


