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 すればいい。
末尾だけ見たいときは、いったん全行をリストにしてから「後ろだけ切り出す」という発想が使える。read や for line in f は、「どう読むか」を組み合わせるための部品。
ここまで来ていれば、
4日目以降の「検索する」「フィルタする」「条件に合う行だけ表示する」といった
“もっと賢いファイルビューア”にも、自然に進んでいけます。

