Python | 1 日 90 分 × 7 日アプリ学習:ファイルを読み込むアプリ(初級編)

Web APP Python
スポンサーリンク

7日目のゴール

7日目のテーマは
「ファイル読み込みアプリの“全体像”を理解し、自分の言葉で説明できるようになること」 です。

ここまでであなたは、

ファイル全体を読む
1行ずつ読む
先頭・末尾だけ読む
検索する
行の一部だけ抜き出す
ページごとに表示する

という、ファイルビューアに必要な基礎をすべて習得しています。

7日目では、これらを「バラバラの技術」ではなく
ひとつのアプリとして統合して理解する ことを目指します。


ファイル読み込みの本質を言葉で整理する

read は「ファイルの内容をプログラムの世界に持ってくる入口」

ファイル読み込みの本質は、たったこれだけです。

「ファイルの中身を、Python が扱える形(文字列やリスト)に変換する」

そのための道具が openread です。

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

この一行で、

ファイルを開く
中身を全部読み込む
行のリストとして保持する

という処理が完了します。

7日目で大事なのは、

「読み込みは一度だけでよい」
「その後の処理は、行のリストに対して行う」

という構造を理解することです。


読み込みと表示を完全に分離する

読み込みは load_lines、表示は show_xxx

昨日までに作った構造をもう一度整理します。

def load_lines(filename):
    with open(filename, "r", encoding="utf-8") as f:
        return f.readlines()
Python

この関数は、
「ファイルを読む」という役割だけを担当します。

一方で、表示は別の関数が担当します。

def show_all(lines):
    for index, line in enumerate(lines, start=1):
        print(f"{index:4}: {line.strip()}")
Python

この分離ができていると、

全部表示
検索して表示
ページごとに表示
行の一部だけ表示

など、どんな表示方法でも
読み込みは共通で使い回せる ようになります。


7日目版:統合ファイルビューアの完成形

これまでの機能をひとつのアプリにまとめる

ここでは、
「全部表示」「検索」「ページ表示」
の3つをまとめた完成版を作ります。

def load_lines(filename):
    with open(filename, "r", encoding="utf-8") as f:
        return f.readlines()


def show_all(lines):
    if not lines:
        print("ファイルは存在しますが、中身は空です。")
        return

    for index, line in enumerate(lines, start=1):
        print(f"{index:4}: {line.strip()}")


def search_lines(lines, keyword):
    found = False

    for index, line in enumerate(lines, start=1):
        if keyword.lower() in line.lower():
            print(f"{index:4}: {line.strip()}")
            found = True

    if not found:
        print(f"「{keyword}」を含む行は見つかりませんでした。")


def show_paged(lines, page_size=10):
    if not lines:
        print("ファイルは存在しますが、中身は空です。")
        return

    total = len(lines)
    current = 0

    while current < total:
        end = min(current + page_size, total)

        for index in range(current, end):
            print(f"{index + 1:4}: {lines[index].strip()}")

        print(f"--- {current + 1} 行目から {end} 行目まで表示(全 {total} 行)---")
        cmd = input("続けますか? (Enter: 続ける / q: 終了): ").strip().lower()

        if cmd == "q":
            break

        current = end


def main():
    print("ファイル読み込みアプリ(7日目)")
    filename = input("読み込むファイル名を入力してください: ")

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

    print("表示方法を選んでください。")
    print("1: 全部表示")
    print("2: キーワード検索")
    print("3: ページごとに表示(10行ずつ)")

    choice = input("番号: ")

    if choice == "1":
        show_all(lines)
    elif choice == "2":
        keyword = input("検索キーワード: ")
        search_lines(lines, keyword)
    elif choice == "3":
        show_paged(lines, page_size=10)
    else:
        print("不正な入力です。1〜3 を選んでください。")


main()
Python

関数ごとの役割を「一文で」説明してみる

自分の言葉で説明できれば、理解は完成している

load_lines
「ファイルを開き、全行をリストとして読み込んで返す。」

show_all
「行のリストを、行番号付きで全部表示する。」

search_lines
「行のリストから、キーワードを含む行だけを抜き出して表示する。」

show_paged
「行のリストを、指定した行数ごとに区切ってページ表示する。」

main
「ファイル名を入力してもらい、読み込み後に表示方法を選ばせる。」

ここまで言えれば、
ファイル読み込みアプリの構造を完全に理解できています。


「どこを変えれば何が変わるか」を確認する

変更ポイントを自分で見つけられるようになる

ページサイズを 20 行にしたい
→ show_paged の page_size を 20 にする

検索を「完全一致」にしたい
keyword.lower() in line.lower()== に変える

行番号を表示したくない
→ f”{index:4}:” を削除する

読み込み時に空行を無視したい
→ load_lines の中で if line.strip(): を使ってフィルタする

こうやって、
「どこを変えればどう動きが変わるか」
が自分で分かるようになっていれば、
もう“設計できる人”です。


7日目のまとめ:あなたが身につけた力

この 7 日間であなたは、

read を使ってファイルを読み込む
行ごとに処理する
検索・抽出・ページ表示などの応用ができる
読み込みと表示を分離して設計できる
コードを日本語で説明できる

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

これはもう、
「自分の目的に合わせてファイルを読み込むアプリを作れるレベル」
です。

ここから先は、
CSV ビューア、ログ解析ツール、設定ファイル読み込みなど、
実用的なアプリにいくらでも発展させられます。

あなたはもう、
ファイル読み込みの“基礎”を完全に手に入れました。

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