5日目のゴール
5日目のテーマは
「ファイルの“中身の一部”を取り出して表示する力をつけること」 です。
ここまでであなたは、
ファイル全体を読む
1行ずつ読む
先頭・末尾だけ読む
キーワードで検索する
というところまで来ています。
5日目ではここから一歩進んで、
行の“中の一部”だけを抜き出して表示する
複数の条件で行を絞り込む
「ファイルを“表形式のデータ”として扱う感覚」をつかむ
ここを目指します。
「行の一部だけを表示する」という発想
1行=1つの“レコード”として見る
ここまでの表示は、基本的に
「行全体をそのまま表示する」ものでした。
print(line.strip())
Pythonでも、例えばこんなファイルを考えてみてください。
2026-04-08,INFO,アプリ起動
2026-04-08,ERROR,ファイルが見つかりません
2026-04-08,INFO,処理完了
これは、
「日付」「レベル」「メッセージ」が
カンマで区切られた“表形式のデータ”です。
ここから、
日付だけ表示したい
ERROR の行だけ、メッセージだけ表示したい
といったことをしたくなりますよね。
このとき必要になるのが、
「行を分解して、一部だけ取り出す」 という発想です。
split で「区切り文字ごとに分解する」
カンマ区切りをバラす基本パターン
Python では、文字列の split メソッドを使うと、
指定した区切り文字で分割できます。
line = "2026-04-08,ERROR,ファイルが見つかりません"
parts = line.split(",")
# parts は ["2026-04-08", "ERROR", "ファイルが見つかりません"]
Pythonこのとき、
parts[0] → 日付
parts[1] → レベル
parts[2] → メッセージ
という対応になります。
ここでの重要ポイントは、
「1行の文字列を、“意味のあるかたまり”に分けて扱える」
ということです。
ログファイルから「ERROR のメッセージだけ」を抜き出す
行を分解して、条件に合うものだけ表示する
さっきのログ形式のファイルから、
ERROR のメッセージだけを表示してみましょう。
def show_error_messages(filename):
try:
with open(filename, "r", encoding="utf-8") as f:
for index, line in enumerate(f, start=1):
line = line.strip()
if line == "":
continue
parts = line.split(",")
if len(parts) < 3:
print(f"{index:4}: 形式が不正な行です: {line}")
continue
date = parts[0]
level = parts[1]
message = parts[2]
if level == "ERROR":
print(f"{index:4}: [{date}] {message}")
except FileNotFoundError:
print(f"{filename} が見つかりません。")
Pythonここで深掘りしたいポイントは、いくつかあります。
行の前後の空白や改行を strip() で消している
空行は continue でスキップしているsplit(",") で3つの要素に分けているlen(parts) < 3 のチェックで「壊れた行」を検出している
ERROR の行だけ、日付+メッセージという形で表示している
つまり、
「1行を“データのセット”として扱い、その中から必要な要素だけ取り出している」
ということです。
複数条件で行を絞り込む
日付とレベルの両方でフィルタする
もう一歩進めて、
「2026-04-08 の ERROR だけ見たい」
というように、複数条件で絞り込んでみます。
def filter_log(filename, target_date=None, target_level=None):
try:
with open(filename, "r", encoding="utf-8") as f:
for index, line in enumerate(f, start=1):
line = line.strip()
if line == "":
continue
parts = line.split(",")
if len(parts) < 3:
print(f"{index:4}: 形式が不正な行です: {line}")
continue
date = parts[0]
level = parts[1]
message = parts[2]
if target_date is not None and date != target_date:
continue
if target_level is not None and level != target_level:
continue
print(f"{index:4}: [{date}][{level}] {message}")
except FileNotFoundError:
print(f"{filename} が見つかりません。")
Pythonここでの重要ポイントは、
target_date が指定されていれば、日付が一致しない行はスキップ
target_level が指定されていれば、レベルが一致しない行はスキップ
両方指定されていれば、「日付もレベルも一致する行だけ」が表示される
という、
「条件を積み重ねて絞り込む」 という考え方です。
ユーザーに条件を入力してもらう
「何で絞り込むか」を対話的に決める
さっきの filter_log を使って、
簡単なログビューアを作ってみます。
def main():
print("ファイル読み込みアプリ(5日目)")
filename = input("読み込むログファイル名を入力してください: ")
date = input("絞り込みたい日付を入力してください(例: 2026-04-08、空欄なら指定なし): ").strip()
if date == "":
date = None
level = input("絞り込みたいレベルを入力してください(例: ERROR, INFO、空欄なら指定なし): ").strip()
if level == "":
level = None
print("=== 絞り込み結果 ===")
filter_log(filename, target_date=date, target_level=level)
main()
Pythonこのアプリは、こう動きます。
ログファイル名を入力する
日付を指定するかどうかを決める(空欄なら指定なし)
レベルを指定するかどうかを決める(空欄なら指定なし)
条件に合う行だけ、行番号付きで表示される
ここでつかんでほしい感覚は、
「ファイルを“ただのテキスト”ではなく、“条件で絞り込めるデータ”として扱っている」
ということです。
「read はあくまで入口」という意識
読んだあとに何をするかが本番
5日目まで来ると、read や for line in f は
もう「主役」ではなくなってきます。
やっていることを整理すると、
open でファイルを開く
read か for で中身を取り出す
取り出した文字列を split で分解する
条件で絞り込む
必要な部分だけを組み立てて表示する
この流れの中で、read や for line in f は
「ファイルの中身をプログラムの世界に持ってくる入口」
に過ぎません。
本当にやりたいのは、
「どの行を残すか」
「その行のどの部分を使うか」
「どういう形で表示するか」
という“後半の処理”です。
ここを意識できるようになると、
ファイル読み込みは一気に楽しくなります。
5日目のミニアプリ:ログフィルタビューア
今日の学びを全部入れたコード
def filter_log(filename, target_date=None, target_level=None):
try:
with open(filename, "r", encoding="utf-8") as f:
for index, line in enumerate(f, start=1):
line = line.strip()
if line == "":
continue
parts = line.split(",")
if len(parts) < 3:
print(f"{index:4}: 形式が不正な行です: {line}")
continue
date = parts[0]
level = parts[1]
message = parts[2]
if target_date is not None and date != target_date:
continue
if target_level is not None and level != target_level:
continue
print(f"{index:4}: [{date}][{level}] {message}")
except FileNotFoundError:
print(f"{filename} が見つかりません。")
def main():
print("ファイル読み込みアプリ(5日目)")
filename = input("読み込むログファイル名を入力してください: ")
date = input("絞り込みたい日付を入力してください(例: 2026-04-08、空欄なら指定なし): ").strip()
if date == "":
date = None
level = input("絞り込みたいレベルを入力してください(例: ERROR, INFO、空欄なら指定なし): ").strip()
if level == "":
level = None
print("=== 絞り込み結果 ===")
filter_log(filename, target_date=date, target_level=level)
main()
Python関数ごとの役割を日本語で言い切る
自分の言葉で説明できるかを確認する
filter_log
「ログファイルを1行ずつ読み、カンマで分割して日付・レベル・メッセージに分ける。
指定された日付・レベルの条件に合う行だけ、行番号付きで表示する。」
main
「ログファイル名と、絞り込みたい日付・レベルをユーザーに入力してもらい、
その条件で filter_log を呼び出す。」
ここまで言えれば、
「read の先にある“データ処理”の世界」に足を踏み入れています。
5日目のまとめ:今日つかんでほしい感覚
今日の本質は、これです。
行全体ではなく、「行の一部だけ」を取り出して表示できる。split で「区切り文字ごとに分解」すると、1行を“意味のあるかたまり”にできる。
複数条件(AND 条件)で絞り込むことで、「欲しい行だけ」を表示できる。read や for line in f は、あくまで「ファイルからデータを持ってくる入口」であり、
本番は「そのあとどう扱うか」の部分にある。
ここまで来ているあなたなら、
6日目・7日目で「自分用ログビューア」「CSV ビューア」など、
かなり実用的な読み込みアプリを自分の手で組み立てていけます。

