つくる JSON保存へ移行
このレッスンでできるようになること。この章で覚えた csv と json と pathlib だけを使って、古い CSV の家計簿を月ごとの JSON へ移す処理を1本書けるようになります。新しい文法は出てきません。
やることは、実際の現場でよくある移行作業そのものです。もともとの家計簿は1行1支出の CSV でした。これを「月をキー、支出のリストを値とする辞書」に組み替えて JSON で保存し直します。移行が終われば、月別の集計をするたびに全行を読み直して日付を切り出す必要がなくなります。
組み立ては次の流れです。まず pathlib で保存先のフォルダを作り、その中に元の CSV を用意します。次に csv.reader で読み込み、見出し行を読み飛ばして、1行を1つの辞書に直します。金額はこのとき int に直しておきます。csv から返る値はすべて文字列だからです。
続いて月ごとにまとめます。日付が "2026-08-03" の形なので、先頭7文字を取れば "2026-08" になります。grouped.setdefault(key, []).append(r) の形を使うと、キーが無ければ空リストを作ってから追加してくれるので、if で分岐せずに済みます。
最後に json.dump で書き出し、書いたファイルを json.load で読み戻して件数と合計を表示します。移行処理では、書きっぱなしにせず必ず読み戻して確かめるのが鉄則です。書けたつもりで壊れていたら、元データを消したあとでは取り返しがつきません。
処理を load_csv と group_by_month の2つの関数に分けておくと、あとで CSV の列が増えたときに直す場所がはっきりします。移行スクリプトは一度きりの使い捨てに見えますが、たいてい何度か作り直すことになるので、読める形にしておく価値があります。
要件
- Path で kakeibo_migrate フォルダを exist_ok=True 付きで作る
- csv.writer で ROWS を kyu_kakeibo.csv に書き出す (newline="" と encoding="utf-8" を付ける)
- load_csv は CSV を読んで、見出しを飛ばし、日付・品名・金額・カテゴリのキーを持つ辞書のリストを返す。金額は int にする
- group_by_month は日付の先頭7文字をキーにして辞書へまとめる
- json.dump で kakeibo.json に保存し (ensure_ascii=False, indent=2)、json.load で読み戻す
- 「移行した件数 4」、月ごとに「月 合計 円」、最後に「保存先 パス」を表示する
入出力例
出力: "移行した件数 4
2026-08 1180 円
2026-09 12250 円
保存先 kakeibo_migrate/kakeibo.json
"