Pythonでテキストファイルを処理する際、ファイル全体を一度に読み込むのではなく、1行ずつ処理したい場面は多くあります。大容量ファイルのメモリ効率化、ログファイルの逐次解析、CSVの行ごとの処理など、ファイルを1行ずつ読み込む操作はPythonのファイル処理の基本スキルのひとつです。
Pythonにはファイルを1行ずつ読み込む方法がいくつかあります。readline()・readlines()・forループによるイテレーション・with文との組み合わせなど、それぞれ特徴と適した用途が異なります。
この記事では、Pythonでファイルを1行ずつ読み込む代表的な方法を、サンプルコードとともにわかりやすく解説していきます。readline()の基本からforループ・with文・大容量ファイルの効率的な処理まで幅広くカバーしていますので、ぜひ参考にしてください。
Pythonでファイルを1行ずつ読み込むにはforループとwith文の組み合わせが基本
それではまず、Pythonでファイルを1行ずつ読み込む最も基本的な方法について解説していきます。
Pythonでファイルを1行ずつ読み込む最もシンプルで推奨される方法が、with文でファイルを開き、forループでイテレーションする書き方です。メモリ効率がよく、ファイルのクローズも自動で行われます。
# まずサンプルファイルを作成
with open("/home/claude/fruits.txt", "w", encoding="utf-8") as f:
f.write("アボカド\nドラゴンフルーツ\nサーモン\nゴリラ茶\nロバコーヒー")
# forループで1行ずつ読み込む
with open("/home/claude/fruits.txt", "r", encoding="utf-8") as f:
for line in f:
print(line, end="")
# 出力結果:アボカド
# 出力結果:ドラゴンフルーツ
# 出力結果:サーモン
# 出力結果:ゴリラ茶
# 出力結果:ロバコーヒー
ファイルオブジェクトはイテラブルなので、forループで直接1行ずつ取り出せます。print()のend=””は行末の改行コードが既に含まれているため重複しないようにするための指定です。
行末の改行コードをstripで取り除く
ファイルから読み込んだ各行には末尾に改行コード(\n)が含まれています。
# 各行の末尾の改行コードを取り除く
with open("/home/claude/fruits.txt", "r", encoding="utf-8") as f:
for line in f:
# strip()で前後の空白・改行を除去
clean_line = line.strip()
print(f"「{clean_line}」")
# 出力結果:「アボカド」
# 出力結果:「ドラゴンフルーツ」
# 出力結果:「サーモン」
# 出力結果:「ゴリラ茶」
# 出力結果:「ロバコーヒー」
strip()を使うと末尾の改行コードだけでなく、前後のスペースやタブも取り除けます。行の内容だけをきれいに取り出したい場合はrstrip(“\n”)で改行のみを削除する方法もあります。
行番号と一緒に読み込む方法
# enumerate()で行番号と一緒に読み込む
with open("/home/claude/fruits.txt", "r", encoding="utf-8") as f:
for i, line in enumerate(f, start=1):
print(f"{i:3}行目:{line.strip()}")
# 出力結果: 1行目:アボカド
# 出力結果: 2行目:ドラゴンフルーツ
# 出力結果: 3行目:サーモン
# 出力結果: 4行目:ゴリラ茶
# 出力結果: 5行目:ロバコーヒー
enumerate()のstart=1を指定することで、1から始まる行番号と行の内容を同時に取得できます。ログ解析やエラー行の特定に役立つパターンです。
readline()とreadlines()で読み込む方法
続いては、readline()とreadlines()を使ったファイルの読み込み方法を確認していきます。
forループ以外にも、readline()で1行ずつ手動で読み込む方法とreadlines()で全行をリストとして取得する方法があります。それぞれ適した用途が異なります。
readline()で1行ずつ読み込む
# readline()で1行ずつ手動で読み込む
with open("/home/claude/fruits.txt", "r", encoding="utf-8") as f:
while True:
line = f.readline()
if not line: # 空文字列はファイルの終端
break
print(line.strip())
# 出力結果:アボカド
# 出力結果:ドラゴンフルーツ
# 出力結果:サーモン
# 出力結果:ゴリラ茶
# 出力結果:ロバコーヒー
readline()はファイルポインタを進めながら1行ずつ返し、ファイルの末尾では空文字列を返します。whileループと組み合わせて「空文字列が返ったら終了」という制御が基本パターンです。
readlines()で全行をリストとして取得する
# readlines()で全行をリストとして読み込む
with open("/home/claude/fruits.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
print(f"行数:{len(lines)}")
print(f"3行目:{lines
.strip()}")
# リストとして扱えるのでスライスも使える
print("最初の2行:")
for line in lines[:2]:
print(f" {line.strip()}")
# 出力結果:行数:5
# 出力結果:3行目:サーモン
# 出力結果:最初の2行:
# 出力結果: アボカド
# 出力結果: ドラゴンフルーツ
readlines()は全行をリストとして返すため、行数の取得や特定行へのインデックスアクセス・スライスが使えます。ただし全行をメモリに読み込むため、大容量ファイルには向きません。
3つの読み込み方法の比較
| 方法 | メモリ効率 | 特徴 | 主な用途 |
|---|---|---|---|
| forループ | 高い | シンプル・推奨 | 一般的な行処理 |
| readline() | 高い | 1行ずつ手動制御 | 条件付き読み込み |
| readlines() | 低い | 全行をリストで取得 | 行数把握・インデックスアクセス |
条件付きで行を処理する応用パターン
続いては、特定の条件に合う行だけを処理する応用的なパターンを確認していきます。
実際のファイル処理では、全行を均一に処理するだけでなく特定のキーワードを含む行だけを抽出したり、空行をスキップしたりする場面が多くあります。
特定のキーワードを含む行だけを抽出する
# サンプルのログファイルを作成
with open("/home/claude/log.txt", "w", encoding="utf-8") as f:
f.write("[INFO] アボカドのデータを読み込みました\n")
f.write("[WARNING] ドラゴンフルーツの在庫が少なくなっています\n")
f.write("[INFO] サーモンの処理が完了しました\n")
f.write("[ERROR] ゴリラ茶のデータが見つかりません\n")
f.write("[INFO] 処理を終了します\n")
# ERRORまたはWARNINGを含む行だけを抽出
with open("/home/claude/log.txt", "r", encoding="utf-8") as f:
for line in f:
clean = line.strip()
if "[ERROR]" in clean or "[WARNING]" in clean:
print(clean)
# 出力結果:[WARNING] ドラゴンフルーツの在庫が少なくなっています
# 出力結果:[ERROR] ゴリラ茶のデータが見つかりません
if文で条件をチェックしながら読み込むことで、必要な行だけを効率よく抽出できます。ログファイルの解析やデータフィルタリングで非常によく使われるパターンです。
空行をスキップして読み込む
# 空行を含むファイルを作成
with open("/home/claude/items.txt", "w", encoding="utf-8") as f:
f.write("キーボード\n\nマウス\n\nモニター\n\nパソコン\n")
# 空行をスキップして読み込む
with open("/home/claude/items.txt", "r", encoding="utf-8") as f:
for line in f:
clean = line.strip()
if not clean: # 空行はスキップ
continue
print(clean)
# 出力結果:キーボード
# 出力結果:マウス
# 出力結果:モニター
# 出力結果:パソコン
strip()後の文字列が空かどうかをチェックしてcontinueでスキップするパターンです。手動で作成したテキストファイルや設定ファイルには空行が混入しやすいため、このチェックは実務でも頻繁に使われます。
特定の行数だけ読み込む
# 先頭から指定した行数だけ読み込む
max_lines = 3
with open("/home/claude/fruits.txt", "r", encoding="utf-8") as f:
for i, line in enumerate(f):
if i >= max_lines:
break
print(f"{i + 1}行目:{line.strip()}")
# 出力結果:1行目:アボカド
# 出力結果:2行目:ドラゴンフルーツ
# 出力結果:3行目:サーモン
enumerate()とbreakを組み合わせることで、先頭から指定行数だけを効率よく読み込めます。大容量ファイルのプレビューやサンプルデータの確認に便利なパターンです。
大容量ファイルを効率的に1行ずつ読み込む方法
続いては、大容量のファイルをメモリ効率よく処理する方法を確認していきます。
数GBを超えるような大きなファイルを一度にメモリに読み込もうとすると、メモリ不足になる可能性があります。forループによるイテレーションはファイルを1行ずつ読み込むためメモリ効率が高く、大容量ファイル処理に適しています。
大容量ファイルをforループで処理する
# 大容量ファイルを想定した効率的な処理
# サンプルとして多数の行を持つファイルを作成
with open("/home/claude/large_file.txt", "w", encoding="utf-8") as f:
for i in range(10000):
f.write(f"ネジ_{i:05d},価格:{i * 10}円,在庫:{i * 2}個\n")
# forループで1行ずつ処理(メモリ効率が高い)
count = 0
total_price = 0
with open("/home/claude/large_file.txt", "r", encoding="utf-8") as f:
for line in f:
parts = line.strip().split(",")
price = int(parts
.replace("価格:", "").replace("円", ""))
total_price += price
count += 1
print(f"処理行数:{count}行")
print(f"合計価格:{total_price:,}円")
# 出力結果:処理行数:10000行
# 出力結果:合計価格:499,950,000円
forループによるイテレーションはファイルポインタを少しずつ進めながら1行ずつ処理するため、ファイルサイズがどれだけ大きくても一定のメモリで処理できます。
読み込んだ行をリストに集約する
# 条件に合う行だけをリストに集約する
results = []
with open("/home/claude/large_file.txt", "r", encoding="utf-8") as f:
for line in f:
parts = line.strip().split(",")
price = int(parts
.replace("価格:", "").replace("円", ""))
# 価格が50000円以上の行だけ収集
if price >= 50000:
results.append(line.strip())
print(f"該当行数:{len(results)}行")
print(f"最初の3件:")
for item in results[:3]:
print(f" {item}")
# 出力結果:該当行数:5000行
# 出力結果:最初の3件:
# 出力結果: ネジ_05000,価格:50000円,在庫:10000個
# 出力結果: ネジ_05001,価格:50010円,在庫:10002個
# 出力結果: ネジ_05002,価格:50020円,在庫:10004個
条件に合う行だけをリストに蓄積することで、大容量ファイルから必要なデータだけを効率よく抽出できます。
複数ファイルを一括で処理する
import os
# 複数のテキストファイルを一括処理
file_list = ["/home/claude/fruits.txt", "/home/claude/items.txt"]
for filepath in file_list:
if not os.path.exists(filepath):
print(f"ファイルが存在しません:{filepath}")
continue
print(f"--- {os.path.basename(filepath)} ---")
with open(filepath, "r", encoding="utf-8") as f:
for line in f:
clean = line.strip()
if clean:
print(f" {clean}")
# 出力結果:--- fruits.txt ---
# 出力結果: アボカド
# 出力結果: ドラゴンフルーツ
# 出力結果: サーモン
# 出力結果: ゴリラ茶
# 出力結果: ロバコーヒー
# 出力結果:--- items.txt ---
# 出力結果: キーボード
# 出力結果: マウス
# 出力結果: モニター
# 出力結果: パソコン
os.path.exists()でファイルの存在確認をしてからwith文で開く処理をループで回すことで、複数ファイルを安全に一括処理できます。
まとめ
この記事では、Pythonでファイルを1行ずつ読み込む方法について、forループ・readline()・readlines()の使い方から条件付き処理・大容量ファイルの効率的な扱いまで幅広く解説しました。
ファイルを1行ずつ読み込む最も推奨される方法は、with文とforループの組み合わせです。メモリ効率が高くコードもシンプルに書けます。readline()は手動での行制御に向いており、readlines()は全行をリストとして扱いたい場合に便利ですが大容量ファイルには不向きです。
strip()での改行除去・enumerate()での行番号付き処理・条件によるスキップなど、今回紹介したパターンを組み合わせることで実務のファイル処理のほとんどに対応できます。ぜひ実際のプロジェクトで活用してみてください。