JSONで保存
このレッスンでできるようになること。json.dump を使って、入れ子になった家計簿の構造をそのままファイルに保存できるようになります。
CSV は表の形をした平らなデータには向いていますが、家計簿を「月ごとに支出のリストを持つ辞書」として持ちたくなると途端に苦しくなります。表の1行に入れ子は書けないので、月を別の列に押し込んだり、ファイルを月ごとに分けたりという工夫が必要になるからです。
JSON は、この入れ子をそのまま書ける形式です。Python の辞書とリストと数値と文字列が、ほぼ同じ形のまま文字列になります。標準ライブラリの json モジュールを使うと、変換は1行で終わります。
import json
kakeibo = {"2026-08": [{"品名": "ノート", "金額": 200}]}
with open("kakeibo.json", "w", encoding="utf-8") as f:
json.dump(kakeibo, f, ensure_ascii=False, indent=2)json.dump はデータとファイルオブジェクトの2つを受け取り、ファイルへ書き込みます。名前が似ている json.dumps は、末尾に s が付いているぶんだけ「文字列 (string) を返す」と覚えると混ざりません。ファイルに書くなら dump、変数に入れたいなら dumps です。
付けておきたい引数が2つあります。ensure_ascii=False を付けないと、日本語が \u30ce のような形に置き換わって、ファイルを開いても人が読めなくなります。indent=2 を付けると改行と字下げが入り、差分を見たときにどこが変わったか分かるようになります。どちらも省略できますが、家計簿のように人が中身を確かめたいデータでは付けておくのが実用的です。
1つだけ落とし穴があります。JSON に書けるのは辞書、リスト、文字列、数値、真偽値、null だけです。日付を date 型のまま dump しようとすると、変換できないというエラーになります。日付は "2026-08-03" のような文字列にしてから保存します。
要件
- json.dump で kakeibo を kakeibo_json.json に書き出す
- ensure_ascii=False と indent=2 を付ける
- open には encoding="utf-8" を付ける
- 書いたファイルを read で読み直し、「21 行」の形で行数を表示する
- 続けて1行目、2行目 (前後の空白を除いたもの)、"コーヒー豆" が本文に含まれるかを表示する
入出力例
出力: "21 行
{
"2026-08": [
True
"