【Pythonファイル操作入門】ToDoリストをJSONで保存する方法【初心者向け】
公開日: 2025年10月12日
前回の記事で作成した「ToDoリストアプリ」、便利に使えていますか? しかし、このアプリには一つだけ、大きな弱点があります。それは、アプリを一度終了すると、登録したタスクがすべて消えてしまうことです。
これでは実用的なアプリとは言えませんよね。そこで今回は、Pythonの「ファイル操作」機能を使って、この問題を解決します。
この記事のゴールは、ToDoリストのデータを「JSON(ジェイソン)」という便利な形式でファイルに保存し、アプリを起動するたびにそのファイルを読み込むことで、データを永続化させることです。 このスキルを身につければ、あなたの作るプログラムは「おもちゃ」から「ツール」へと大きく進化します。
💾 データの永続化とは? なぜJSON?
プログラムの変数(リストなど)に保存されたデータは、メモリという一時的な場所に置かれているため、プログラムが終わると消えてしまいます。 データをファイルに書き出すことで、ハードディスクなどの長期的な記憶装置に保存し、いつでも取り出せるようにすることをデータの永続化と呼びます。
💡 JSON (JavaScript Object Notation) とは?
Pythonのリストや辞書のようなデータ構造を、人間にも機械にも読みやすいテキスト形式で表現するための世界標準のフォーマットです。Webの世界ではAPIのデータ交換などで頻繁に使われており、覚えておいて損はない必須知識です。
完成コード全体
今回改造する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)モードで開くという意味です。
- encoding="utf-8": 日本語などの文字化けを防ぐためのおまじないです。
- json.dump(...): Pythonのリスト(`todos_list`)を、JSON形式のテキストに変換してファイル(`f`)に書き込みます。
ファイルからの読み込み (`load_todos` 関数)
def load_todos():
try:
with open(FILENAME, "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
return [] # ファイルがなければ空のリストを返す
- "r": ファイルを**読み込み (Read)**モードで開きます。
- json.load(f): JSONファイル(`f`)の中身を読み込み、Pythonのリストに変換して返します。
- try-except FileNotFoundError: これは非常に重要です。アプリを初めて起動した時は、まだ todos.json ファイルが存在しないため、エラーが発生します。このエラーを except で捕まえ、その場合は代わりに空のリスト [] を返すことで、初回起動でも問題なく動作するようにしています。
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リストアプリに「データの永続化」という重要な機能を追加しました。
- with open() で安全にファイルを操作し、
- json.dump() でPythonのデータをファイルに書き出し、
- json.load() でファイルからデータを読み込む。
- try-except で、ファイルが存在しないといった予期せぬ事態に備える。
これらのスキルは、設定ファイルの読み書き、簡単なデータベースの作成、Web APIとの連携など、あらゆる場面で応用が効く強力な武器となります。 あなたの作るPythonプログラムは、もうただの使い捨てではありません。データを蓄積し、成長していく「本物のツール」への第一歩を、あなたは今日踏み出したのです!
プログラミング学習に必須ツール!
記事で紹介したコードがよく分からなかったり、ご自身のコードについてもっと知りたい場合は、AIコード解説ツールが便利です。コードを貼り付けるだけで、AIが日本語で分かりやすく解説します。
AIコード解説ツールを使ってみる →