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

Web APP Python
スポンサーリンク

2日目のゴール

2日目のテーマは
「ファイルを“1行ずつ”読みながら、見やすく表示できるようになること」 です。

1日目は read() で「全部まとめて読む」だけでした。
今日はそこから一歩進んで、

行ごとに処理する
行番号をつけて表示する
空行や余計な改行をきれいに扱う

ここを狙っていきます。


read() と「行ごとに読む」の違いを整理する

read() は「全部まとめて」、for は「1行ずつ」

1日目のコードはこうでした。

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

print(text)
Python

これは「ファイル全体をひとつの長い文字列として読む」方法です。

一方で、Python のファイルオブジェクトは
for 文で回すと「1行ずつ」取り出せます。

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

このとき line には、
1行分の文字列(末尾に \n 付き)が入ります。

ここで大事なのは、

read() → 全部まとめて
for line in f: → 1行ずつ

という「読み方の粒度」が違う、という感覚です。


行ごとに読むときの「改行」の扱い

print(line) すると改行が二重になる理由

次のコードを考えてみます。

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

ファイルの中身がこうだったとします。

りんご
みかん
ぶどう

実行すると、行と行の間に
1行ずつ空行が入ってしまうことがあります。

これは、

line の末尾にすでに \n が入っている
print も自動で改行を入れる

という「改行の二重掛け」が起きているからです。

そこでよく使うのが strip() です。

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

strip() は、前後の空白や改行を取り除いてくれます。
これで「ちょうどよく1行ずつ」表示されます。


行番号をつけて表示してみる

enumerate を使うと「何行目か」が簡単に分かる

ログファイルやメモを読むとき、
「何行目か」が分かると便利です。

Python には enumerate という関数があり、
for と組み合わせると「番号付きループ」が書けます。

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

ここでのポイントは、

enumerate(f, start=1)
「1行目なら index=1, 2行目なら index=2 …」
という形で番号をつけてくれることです。

これで、表示はこうなります。

1: りんご
2: みかん
3: ぶどう

「ただ読む」から一歩進んで、
「読みながら情報を付け足す」 ことができるようになります。


行ごと表示を関数にまとめる

「行番号付きで表示するビューア」を作る

1日目の main を、
2日目仕様に書き換えてみます。

def show_file_with_line_numbers(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} が見つかりません。ファイル名を確認してください。")
Python

ここでのポイントは二つです。

show_file_with_line_numbers という「役割の名前」をつけたこと
{index:4} で行番号の桁をそろえていること

{index:4} は「4文字ぶんの幅で右寄せ」という意味です。
行数が増えても、番号の桁が揃って見やすくなります。


2日目のミニアプリ:行番号付きファイルビューア

今日の学びを全部入れたコード

def show_file_with_line_numbers(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 main():
    print("ファイル読み込みアプリ(2日目)")
    filename = input("読み込むファイル名を入力してください: ")

    print("=== 行番号付きで表示します ===")
    show_file_with_line_numbers(filename)


main()
Python

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

起動するとタイトルが出る
ファイル名を入力する
存在すれば、1行ずつ行番号付きで表示される
存在しなければ「見つかりません」と表示される

1日目の「ただ全部表示」から、
「構造を意識した表示」 に一歩進んだ形です。


重要ポイントをもう一段深掘りする

なぜ「行ごとに読む」ことが大事なのか

行ごとに読むと、こんなことができるようになります。

特定の行だけスキップする
空行だけ無視する
「エラー」という文字を含む行だけ表示する
長すぎる行は途中で切る

つまり、

「ファイルを“データの集まり”として扱えるようになる」

ということです。

2日目ではまだ「行番号をつける」だけですが、
この「1行ずつ処理する」という感覚は、
ログ解析・設定ファイル処理・CSV 読み込みなど、
いろんな場面で土台になります。


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

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

read() は「全部まとめて」、for line in f: は「1行ずつ」
行ごとに読むときは、line.strip() で余計な改行を消すと見やすい
enumerate を使うと「何行目か」を簡単に扱える
「行番号付きで表示する」という“役割の名前”を関数につけると、コードの意図がはっきりする

ここまで理解できていれば、
3日目の「一部だけ表示する」「先頭だけ見る」「末尾だけ見る」といった
“ちょっと賢いファイルビューア”に、自然に進んでいけます。

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