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

Web APP Python
スポンサーリンク

3日目のゴール

3日目のテーマは
「ファイルの“全部”ではなく、“一部だけ”を読む感覚を身につけること」 です。

1日目:read() で全部読む
2日目:for line in f で1行ずつ読む

3日目ではここから一歩進んで、

先頭の数行だけ表示する
末尾の数行だけ表示する(ログっぽい動き)
「読みながら、どこまで表示するか自分でコントロールする」

ここを目指します。


「全部読む」と「一部だけ読む」の発想の違い

ファイルを“流れ”として見る

2日目までで、ファイルはこう読んでいました。

with open(filename, "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())
Python

これは「最初の行から最後の行まで、全部読む」動きです。

3日目でやりたいのは、

最初の 5 行だけ見たい
最後の 10 行だけ見たい

といった、「一部だけ見る」という発想です。

ここで大事なのは、

「ファイルは、先頭から順番に流れてくる“行のストリーム”だ」

というイメージを持つことです。


先頭の数行だけ表示する(head 的な動き)

行数を数えながら途中で止める

「先頭の 5 行だけ表示したい」とします。
やることはシンプルで、

1行ずつ読む
何行目か数える
指定した行数に達したらやめる

これをコードにすると、こうなります。

def show_head(filename, max_lines=5):
    try:
        with open(filename, "r", encoding="utf-8") as f:
            for index, line in enumerate(f, start=1):
                print(f"{index:4}: {line.strip()}")

                if index >= max_lines:
                    break

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

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

enumerate で「今何行目か」を追いかけている
if index >= max_lines: break で「ここで終わり」と決めている

ということです。

read() のように「全部読む」のではなく、
「どこで読むのをやめるか」を自分で決めている のがポイントです。


末尾の数行だけ表示する(tail 的な動き)

いったん全部読み込んで、後ろだけ取り出す

「最後の 5 行だけ見たい」というのは、
ログファイルなどでよくあるニーズです。

シンプルなやり方は、

全部の行をリストとして読み込む
リストの末尾から必要な行数だけ取り出す

という方法です。

def show_tail(filename, max_lines=5):
    try:
        with open(filename, "r", encoding="utf-8") as f:
            lines = f.readlines()

        total = len(lines)

        if total == 0:
            print("ファイルは存在しますが、中身は空です。")
            return

        start = max(0, total - max_lines)
        for index in range(start, total):
            line_no = index + 1
            print(f"{line_no:4}: {lines[index].strip()}")

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

ここでの深掘りポイントは、いくつかあります。

readlines() は「全行をリストとして読み込む」
len(lines) で「何行あるか」が分かる
total - max_lines で「どこから表示するか」を計算している
インデックスは 0 始まりなので、行番号は index + 1 にしている

つまり、

「ファイル全体を“行のリスト”として扱い、その一部だけを切り出している」

ということです。


head と tail をメニューから選べるようにする

「全部」「先頭」「末尾」を切り替えられるビューア

ここまでの機能をまとめて、
3日目のミニアプリにします。

def show_all(filename):
    try:
        with open(filename, "r", encoding="utf-8") as f:
            for index, line in enumerate(f, start=1):
                print(f"{index:4}: {line.strip()}")

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


def show_head(filename, max_lines=5):
    try:
        with open(filename, "r", encoding="utf-8") as f:
            for index, line in enumerate(f, start=1):
                print(f"{index:4}: {line.strip()}")

                if index >= max_lines:
                    break

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


def show_tail(filename, max_lines=5):
    try:
        with open(filename, "r", encoding="utf-8") as f:
            lines = f.readlines()

        total = len(lines)

        if total == 0:
            print("ファイルは存在しますが、中身は空です。")
            return

        start = max(0, total - max_lines)
        for index in range(start, total):
            line_no = index + 1
            print(f"{line_no:4}: {lines[index].strip()}")

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


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

    print("表示方法を選んでください。")
    print("1: 全部表示")
    print("2: 先頭だけ表示(デフォルト5行)")
    print("3: 末尾だけ表示(デフォルト5行)")
    choice = input("番号: ")

    if choice == "1":
        show_all(filename)
    elif choice == "2":
        show_head(filename, max_lines=5)
    elif choice == "3":
        show_tail(filename, max_lines=5)
    else:
        print("不正な入力です。1, 2, 3 のどれかを選んでください。")


main()
Python

関数ごとの役割を日本語で言い切る

「何をしている関数か」を自分の言葉で説明する

show_all
「ファイルを先頭から最後まで、行番号付きで全部表示する。」

show_head
「ファイルの先頭から、指定された行数(デフォルト5行)だけ行番号付きで表示する。」

show_tail
「ファイル全体を一度リストとして読み込み、末尾から指定された行数だけ行番号付きで表示する。」

main
「ファイル名と表示方法(全部・先頭・末尾)を選んでもらい、対応する関数を呼び出す。」

ここまで言えれば、
「ファイルをどう読むかを、自分で設計できている状態」 です。


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

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

ファイルは「全部読む」だけでなく、「どこまで読むか」「どこから読むか」を自分で決められる。
先頭だけ見たいときは、行数を数えながら途中で break すればいい。
末尾だけ見たいときは、いったん全行をリストにしてから「後ろだけ切り出す」という発想が使える。
readfor line in f は、「どう読むか」を組み合わせるための部品。

ここまで来ていれば、
4日目以降の「検索する」「フィルタする」「条件に合う行だけ表示する」といった
“もっと賢いファイルビューア”にも、自然に進んでいけます。

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