JSONで保存
このレッスンでできるようになること。json.dump を使って、入れ子になった家計簿の構造をそのままファイルに保存できるようになります。
CSV は表の形をした平らなデータには向いていますが、家計簿を「月ごとに支出のリストを持つ辞書」として持ちたくなると途端に苦しくなります。表の1行に入れ子は書けないので、月を別の列に押し込んだり、ファイルを月ごとに分けたりという工夫が必要になるからです。
JSON は、この入れ子をそのまま書ける形式です。Python の辞書とリストと数値と文字列が、ほぼ同じ形のまま文字列になります。標準ライブラリの json モジュールを使うと、変換は1行で終わります。
Python
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 です。
保存した文字列の行を確かめるときは splitlines() を使います。改行で区切ったリストになるので、添字で1行ずつ取り出せます。字下げの空白はそのまま残ります。
Python
sample = "見出し\n 本文\n"
rows = sample.splitlines()
print(rows[1]) # 先頭に空白2つを残して表示する付けておきたい引数が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 で読み直し、text に入れる
- 用意済みの show_saved_text は行数、1行目、2行目、"コーヒー豆" が含まれるかを表示する。2行目の字下げは残す