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())
Pythonstrip() は、前後の空白や改行を取り除いてくれます。
これで「ちょうどよく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日目の「一部だけ表示する」「先頭だけ見る」「末尾だけ見る」といった
“ちょっと賢いファイルビューア”に、自然に進んでいけます。

