Python | 1 日 90 分 × 7 日アプリ学習:ファイルに保存するメモ帳(初級編)

Web APP Python
スポンサーリンク

6日目のゴール

6日目のテーマは
「ファイル保存メモ帳を“ちょっと賢くする”こと」です。

ここまでであなたは、

ファイルに書ける
追記できる
読み込める
ファイル名を自分で指定できる

というところまで来ています。

今日はここから一歩進んで、

よく使う「保存処理」を関数として共通化する
日付入りのファイル名を自動でつけてみる
openwrite を「部品」として意識して組み立てる

ここを目指します。


open と write を「共通の部品」にする発想

毎回同じようなコードを書いていないかを疑う

5日目までのコードを思い出してみてください。

メモを書くときも
メモを読むときも

毎回こういう形が出てきていました。

with open(filename, "a", encoding="utf-8") as f:
    f.write(何か)

with open(filename, "r", encoding="utf-8") as f:
    text = f.read()
Python

これ自体は正しいのですが、
「ファイルにテキストを書き込む」という処理は
どこでも同じパターンです。

そこで今日は、
「ファイルにテキストを書き込む関数」
を一つ用意して、そこにまとめてしまいます。


「テキストをファイルに保存する関数」を作る

save_text(filename, text) という“道具”を用意する

まずは、シンプルな保存関数を作ります。

def save_text(filename, text, mode="a"):
    with open(filename, mode, encoding="utf-8") as f:
        f.write(text)
Python

この関数は、日本語で言うとこうです。

「指定されたファイルを、指定されたモードで開き、
渡されたテキストを書き込む」

ここでの重要ポイントは二つあります。

mode を引数にしているので、”a” でも “w” でも使える
openwrite のセットを一か所にまとめている

これで、他の場所では
openwrite の細かい書き方を意識せずに済みます。


save_text を使ってメモ保存をシンプルに書き直す

行ごとの保存を「1行ずつ save_text で呼ぶ」

複数行メモを書く関数を、こう書き換えられます。

def write_memo():
    filename = input("保存するファイル名を入力してください: ")

    print("メモを入力してください。空行で終了します。")

    while True:
        line = input("> ")

        if line.strip() == "":
            print(f"入力終了。{filename} に保存しました。")
            break

        save_text(filename, line + "\n", mode="a")
Python

ここでの深掘りポイントは、

with open(...) が write_memo から消えている
「どのファイルに」「何を書き込むか」だけを考えればよくなっている

ということです。

openwrite の“細かい操作”は
save_text に押し込めてしまい、
上のレベルの関数では「何をしたいか」だけを書く。

これは、プログラミングを続けるうえで
とても大事な感覚です。


日付入りファイル名を自動でつけてみる

「毎日の日記ファイル」をイメージする

ここで、少しだけ実用寄りの話をします。

例えば、
「今日の日付をファイル名にした日記」
を作りたいとします。

2026-04-08.txt
2026-04-09.txt

のようなファイル名です。

Python では、日付を扱うために
datetime というモジュールを使います。

from datetime import datetime

def get_today_filename():
    today = datetime.now()
    date_str = today.strftime("%Y-%m-%d")
    return f"{date_str}.txt"
Python

この関数は、

今日の日付を “2026-04-08” のような文字列にして
それに “.txt” をつけて返す

という役割です。


日付ファイルに自動保存するメモ機能

ファイル名を聞かずに「今日の日記」として保存する

さっきの get_today_filename を使って、
「今日の日記を書く」機能を作ってみます。

def write_today_diary():
    filename = get_today_filename()
    print(f"今日の日記ファイル: {filename}")
    print("日記を入力してください。空行で終了します。")

    while True:
        line = input("> ")

        if line.strip() == "":
            print(f"入力終了。{filename} に保存しました。")
            break

        save_text(filename, line + "\n", mode="a")
Python

ここでの重要ポイントは、

ユーザーにファイル名を聞いていない
「今日」という概念をプログラム側が持っている

ということです。

これだけで、
「日付ごとに自動でファイルが分かれる日記アプリ」
になります。


メニューに「今日の日記を書く」を追加する

機能が増えても main は“流れだけ”にする

ここまでの機能をメニューにまとめます。

from datetime import datetime


def save_text(filename, text, mode="a"):
    with open(filename, mode, encoding="utf-8") as f:
        f.write(text)


def get_today_filename():
    today = datetime.now()
    date_str = today.strftime("%Y-%m-%d")
    return f"{date_str}.txt"


def write_memo():
    filename = input("保存するファイル名を入力してください: ")

    print("メモを入力してください。空行で終了します。")

    while True:
        line = input("> ")

        if line.strip() == "":
            print(f"入力終了。{filename} に保存しました。")
            break

        save_text(filename, line + "\n", mode="a")


def write_today_diary():
    filename = get_today_filename()
    print(f"今日の日記ファイル: {filename}")
    print("日記を入力してください。空行で終了します。")

    while True:
        line = input("> ")

        if line.strip() == "":
            print(f"入力終了。{filename} に保存しました。")
            break

        save_text(filename, line + "\n", mode="a")


def read_memo():
    filename = input("読み込むファイル名を入力してください: ")

    print(f"=== {filename} の内容 ===")

    try:
        with open(filename, "r", encoding="utf-8") as f:
            text = f.read()

        if text.strip() == "":
            print("ファイルは存在しますが、中身は空です。")
        else:
            print(text)

    except FileNotFoundError:
        print(f"{filename} が見つかりません。")


def show_menu():
    print("==========")
    print("ファイル保存メモ帳(6日目)")
    print("1: メモを書く(ファイル名を指定)")
    print("2: メモを読む(ファイル名を指定)")
    print("3: 今日の日記を書く(自動ファイル名)")
    print("0: 終了")
    print("==========")


def main():
    while True:
        show_menu()
        choice = input("番号を選んでください: ")

        if choice == "1":
            write_memo()
        elif choice == "2":
            read_memo()
        elif choice == "3":
            write_today_diary()
        elif choice == "0":
            print("アプリを終了します。")
            break
        else:
            print("不正な入力です。0, 1, 2, 3 のどれかを選んでください。")


main()
Python

役割を日本語で言い切ってみる

関数ごとの「一文説明」

save_text
指定されたファイルを指定モードで開き、渡されたテキストを書き込む共通関数。

get_today_filename
今日の日付から「YYYY-MM-DD.txt」というファイル名を作って返す。

write_memo
ユーザーが指定したファイル名に、複数行のメモを追記する。

write_today_diary
今日の日付をファイル名にして、日記を複数行保存する。

read_memo
ユーザーが指定したファイルを読み込み、内容を表示する。

show_menu
メモ帳アプリのメニューを表示する。

main
メニューを繰り返し表示し、選ばれた番号に応じて機能を呼び分ける。

ここまで日本語で説明できていれば、
openwrite を「ただの命令」ではなく
「アプリの中の部品」として扱えている状態です。


6日目のまとめ:今日つかんでほしい感覚

今日の本質はこれです。

openwrite は、
「ファイルにテキストを書き込む」という一つのまとまりとして
関数に閉じ込めてしまえる。

ファイル名は、
ユーザーに入力してもらってもいいし、
プログラム側で日付などから自動生成してもいい。

メニューは、
「どの機能(どの関数)を呼ぶか」を選ぶ“入り口の一覧”。

ここまで来ているあなたなら、
7日目に「自分のメモ帳アプリを言葉で説明して、
どこをどう変えればどう拡張できるか」を
自分の頭で考えられるところまで行けます。

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