【Pythonファイル操作入門】ToDoリストをJSONで保存する方法【初心者向け】 更新日: 2026年1月21日 初めてプログラミングでツールを作った時のことです。 私は「家計簿アプリ」を作りました。数時間かけてコードを書き、意気揚々とその日の出費を入力しました。 「よし、完璧だ!」と思ってアプリを閉じ、翌日もう一度開くと... データは全て消えていました。 当時の私は「メモリ」と「ディスク」の違いを理解しておらず、変数はプログラム終了とともに消えるという当たり前の事実を知らなかったのです。あの時の虚無感は忘れられません。 今日は、当時の私のような悲劇を防ぐために、Pythonの「ファイル操作」機能を使って、データを「JSON(ジェイソン)」という形式でファイルに保存し、永続化させる方法を解説します。 💾 データの永続化とは? なぜJSON? プログラムの変数は「メモリ」という一時的な場所に置かれているため、電源を切ると消えます。 データを「ファイル」に書き出すことで、ハードディスクなどの長期的な記憶装置に保存し、いつでも取り出せるようにすることを「データの永続化」と呼びます。 💡 なぜJSONを使うの? 昔の私は、独自のルール(例:カンマ区切りのテキスト)で保存しようとして、読み込み時のバグに苦しみました。 JSONは、Pythonのリストや辞書をそのまま保存・復元できる世界標準のフォーマットです。これを使えば、面倒な変換処理を自分で書く必要がなくなります。 完成コード全体 今回改造するToDoリストアプリの完成コードです。どこが変わり、なぜそう書かれているのかを、ステップごとに見ていきましょう。 import json FILENAME = "todos.json" def save_todos(todos_list): """ToDoリストをJSONファイルに保存する関数""" with open(FILENAME, "w", encoding="utf-8") as f: json.dump(todos_list, f, ensure_ascii=False, indent=2) def load_todos(): """JSONファイルからToDoリストを読み込む関数""" try: with open(FILENAME, "r", encoding="utf-8") as f: return json.load(f) except FileNotFoundError: return [] # ファイルがなければ空のリストを返す # --- メイン処理 --- todos = load_todos() # アプリ起動時にデータを読み込む print("シンプルなToDoリストアプリ(保存機能付き)") while True: command = input("コマンドを選択してください (add, list, done, exit): ") if command == "add": task = input("追加するタスクを入力してください: ") todos.append(task) save_todos(todos) # ★変更点:タスク追加後に保存 print("タスクを追加しました。") elif command == "list": # (変更なし) print("--- ToDoリスト ---") for i, task in enumerate(todos, start=1): print(f"{i}: {task}") print("------------------") elif command == "done": try: done_index_str = input("完了にするタスクの番号を入力してください: ") done_index = int(done_index_str) - 1 if 0 <= done_index < len(todos): removed_task = todos.pop(done_index) save_todos(todos) # ★変更点:タスク完了後に保存 print(f"タスク「{removed_task}」を完了しました。") else: print("無効な番号です。") except ValueError: print("番号で入力してください。") elif command == "exit": print("アプリを終了します。") break else: print("無効なコマンドです。") ⚙️ 機能追加のステップ解説 1. 機能の部品化:保存と読み込みを「関数」にする 「ファイルに保存する」「ファイルから読み込む」という処理は、アプリの複数の場所から呼び出されます。 そこで、これらの処理を関数としてまとめておくことで、コードが整理され、再利用しやすくなります。 ファイルへの保存 (save_todos 関数) import json # JSONを扱うためのライブラリをインポート FILENAME = "todos.json" # ファイル名を定数として定義 def save_todos(todos_list): with open(FILENAME, "w", encoding="utf-8") as f: json.dump(todos_list, f, ensure_ascii=False, indent=2) with open(...): ファイルを開くための決まり文句です。with を使うと、処理が終わった後に自動でファイルを閉じてくれるので安全です。 "w": ファイルを書き込み (Write)モードで開くという意味です。 json.dump(...): Pythonのリストを、JSON形式のテキストに変換してファイルに書き込みます。 ファイルからの読み込み (load_todos 関数) def load_todos(): try: with open(FILENAME, "r", encoding="utf-8") as f: return json.load(f) except FileNotFoundError: return [] # ファイルがなければ空のリストを返す "r": ファイルを読み込み (Read)モードで開きます。 try-except FileNotFoundError: これは非常に重要です。アプリを初めて起動した時は、まだ todos.json ファイルが存在しないため、エラーが発生します。このエラーを捕まえ、空のリストを返すことで、初回起動でも問題なく動作するようにしています。 2. メイン処理への組み込み 作成した関数を、メインの処理に組み込んでいきます。変更点はわずか3箇所です。 起動時にデータを読み込む アプリが起動したら、まず最初に load_todos() 関数を呼び出して、todos リストを復元します。 todos = load_todos() # アプリ起動時にデータを読み込む データが変更されたタイミングで保存する ToDoリストの中身が変わるのは、「タスクを追加した時(`add`)」と「タスクを完了した時(`done`)」の2箇所です。 それぞれの処理の直後に save_todos(todos) を呼び出す一行を追加します。 # "add" コマンドの中 todos.append(task) save_todos(todos) # ← この一行を追加 # "done" コマンドの中 removed_task = todos.pop(done_index) save_todos(todos) # ← この一行を追加 たったこれだけで、データが変更されるたびに、自動でファイルが最新の状態に更新されるようになります。 まとめ お疲れ様でした!今回は、ファイル操作とJSONを使い、ToDoリストアプリに「データの永続化」という重要な機能を追加しました。 データが消えないアプリが完成した時の、「あ、これで本当に使えるツールになった」という感覚。 これこそが、プログラミングの醍醐味です。 あなたの作るPythonプログラムは、もうただの使い捨てではありません。データを蓄積し、成長していく「本物のツール」への第一歩を、あなたは今日踏み出したのです! プログラミング学習に必須ツール! 記事で紹介したコードがよく分からなかったり、ご自身のコードについてもっと知りたい場合は、AIコード解説ツールが便利です。コードを貼り付けるだけで、AIが日本語で分かりやすく解説します。 AIコード解説ツールを使ってみる →