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

Web APP Python
スポンサーリンク
スポンサーリンク

7日目のゴール

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

ここまでであなたは、

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

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

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


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

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

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

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

そのための道具が open と read です。

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をコピーしました