Python | 1 日 120 分 × 7 日アプリ学習:JSON保存アプリ(中級編)

Web APP Python
スポンサーリンク

2日目のゴール

2日目のテーマは
「JSONを使って“ユーザーが入力したデータ”を保存し、起動時に復元できる小さなアプリを作ること」 です。

1日目は、PythonのdictlistをJSONに保存して、また読み戻す「技」を学びました。
2日目は、その技を一歩進めて、
プログラムを実行するたびに消えてしまうデータではなく、
「前回の続きから使えるアプリ」 を作るところまで行きます。

ここが「ただのスクリプト」と「アプリ」の大きな境目です。


1日目の復習をアプリ目線で捉え直す

「メモ帳アプリ」を頭に思い浮かべる

例えば、簡単な「メモ帳アプリ」を考えてみます。
ユーザーがメモを入力して、次に起動したときにもそのメモが残っている。
これを実現するには、次の流れが必要です。

プログラム起動時に、前回までのメモをファイルから読み込む。
ユーザーが新しいメモを追加する。
終了するときに、すべてのメモをファイルに保存する。

この「ファイル」が、今日の主役である JSON です。
1日目でやった「dict/list ↔ JSONファイル」の往復が、そのまま使えます。


今日の題材:シンプルな「メモ保存アプリ」

データの形を先に決める

まずは、「メモ1件」をどう表現するかを決めます。
最初はシンプルに、テキストだけを持つことにしましょう。

Pythonでは、1件のメモをこう表せます。

memo = {
    "text": "牛乳を買う"
}
Python

複数のメモは、リストで持ちます。

memos = [
    {"text": "牛乳を買う"},
    {"text": "Pythonの勉強を30分する"}
]
Python

JSONにすると、こうなります。

[
  {
    "text": "牛乳を買う"
  },
  {
    "text": "Pythonの勉強を30分する"
  }
]

この「リストの中に辞書が並んでいる形」が、
JSON保存アプリの基本パターンになります。


JSONファイルに保存する関数を作る

「保存処理」を毎回書かないようにする

まずは、memos を JSON ファイルに保存する関数を作ります。
ファイル名は memos.json としましょう。

import json

FILENAME = "memos.json"

def save_memos(memos):
    with open(FILENAME, "w", encoding="utf-8") as f:
        json.dump(memos, f, ensure_ascii=False, indent=2)
Python

ここで大事なのは、「保存のやり方」を一箇所にまとめていることです。
アプリのあちこちで openjson.dump を書き散らすのではなく、
「保存したいときは save_memos(memos) を呼ぶだけ」という形にしておくと、
後から直すときも、読むときも、とても楽になります。


JSONファイルから読み込む関数を作る

初回起動でもエラーにならないようにする

次に、起動時に memos.json からデータを読み込む関数を作ります。
ここで重要なのは、「ファイルがまだ存在しない場合」の扱いです。

import os
import json

FILENAME = "memos.json"

def load_memos():
    if not os.path.exists(FILENAME):
        return []

    with open(FILENAME, "r", encoding="utf-8") as f:
        memos = json.load(f)

    return memos
Python

この関数のポイントを深掘りします。

まず、os.path.exists(FILENAME) でファイルの有無を確認しています。
初めてアプリを起動したときは、まだ memos.json がありません。
そのときに open(..., "r") をするとエラーになってしまうので、
ファイルがなければ「空のリスト」を返すようにしています。

これにより、アプリ側は
「メモが1件もない状態」として自然に動き始めることができます。


ユーザーからメモを受け取って、リストに追加する

「入力 → 追加 → 保存」の流れを作る

次に、ユーザーからメモを入力してもらい、
memos に追加する処理を書きます。

def add_memo(memos):
    text = input("メモを入力してください: ")
    if text == "":
        print("空のメモは追加しません。")
        return

    memo = {"text": text}
    memos.append(memo)
    print("メモを追加しました。")
Python

ここでのポイントは、
「空文字は追加しない」という簡単なバリデーションを入れていることです。
こういう小さな工夫が、アプリの使い心地を良くします。


メモ一覧を表示する

JSONから戻ってきたデータを「見える形」にする

保存して終わりではなく、
今どんなメモがあるのかを表示できるようにします。

def show_memos(memos):
    if not memos:
        print("メモはまだありません。")
        return

    print("=== メモ一覧 ===")
    for i, memo in enumerate(memos, start=1):
        print(f"{i}. {memo['text']}")
Python

ここでは、enumerate を使って
「1番、2番、3番…」と番号を振って表示しています。
この番号は、後で「削除」や「編集」をするときにも使えます。


2日目のミニアプリ:メモをJSONに保存するアプリ

起動時に読み込み、終了までメモを保持する

ここまでの部品を組み合わせて、
1ファイルの小さなアプリにしてみます。

import json
import os

FILENAME = "memos.json"

def load_memos():
    if not os.path.exists(FILENAME):
        return []
    with open(FILENAME, "r", encoding="utf-8") as f:
        return json.load(f)

def save_memos(memos):
    with open(FILENAME, "w", encoding="utf-8") as f:
        json.dump(memos, f, ensure_ascii=False, indent=2)

def add_memo(memos):
    text = input("メモを入力してください: ")
    if text == "":
        print("空のメモは追加しません。")
        return
    memo = {"text": text}
    memos.append(memo)
    print("メモを追加しました。")

def show_memos(memos):
    if not memos:
        print("メモはまだありません。")
        return
    print("=== メモ一覧 ===")
    for i, memo in enumerate(memos, start=1):
        print(f"{i}. {memo['text']}")

def main():
    memos = load_memos()
    print("JSONファイルからメモを読み込みました。")

    while True:
        print("\n=== メニュー ===")
        print("1: メモを追加")
        print("2: メモ一覧を表示")
        print("0: 終了")

        choice = input("番号を選んでください: ")

        if choice == "1":
            add_memo(memos)
            save_memos(memos)

        elif choice == "2":
            show_memos(memos)

        elif choice == "0":
            save_memos(memos)
            print("終了します。")
            break

        else:
            print("正しい番号を入力してください。")

main()
Python

このアプリは、次のように動きます。

プログラムを起動すると、memos.json があれば読み込む。
メモを追加すると、そのたびに JSON に保存される。
終了するときにも、最新の状態を保存する。
次に起動したとき、前回のメモがそのまま残っている。

ここまで来ると、
「JSONを使ってアプリの状態を永続化している」
と言っていいレベルです。


2日目で絶対に押さえてほしいこと

「アプリの起動前と起動後」をつなぐのがJSON

今日の本質は、これです。

プログラムの中の listdict は、
実行が終わると消えてしまう。

でも、JSONファイルに書き出しておけば、
次に起動したときに「前回の続き」から始められる。

その橋渡しをしているのが、

load_memos() の「起動時に読み込む」
save_memos() の「変更したら保存する」

という2つの関数です。

そして、もうひとつ大事なのは、

ファイルがないときは空リストを返す
保存処理を関数にまとめる

という「ちょっとした設計の工夫」です。
これが、後の3日目以降の「検索・更新・削除」や
「フィルタ・ソート」にそのままつながっていきます。


次の日へのつながり

3日目では、
このメモアプリの考え方をそのまま使って、

JSONに保存されたデータを
「検索する」「直す」「消す」

という、アプリに必須の操作を追加していきます。

もし余裕があれば、
今日のメモアプリを少し改造してみてください。

例えば、メモに「作成日時」を追加する。
例えば、「重要」フラグをつける。

それだけで、JSONが
「ただの保存形式」ではなく
「あなたが設計したデータの形」 になっていく感覚がつかめます。

タイトルとURLをコピーしました