Pythonでテキストファイルの中身を読み込む際、組み込み関数の open() を使用しますが、その後の「データの取り出し方」には主に3つのメソッドが存在します。
read(): 全体を1つの文字列として読み込むreadlines(): 全体をリスト(行ごとの配列)として読み込むreadline(): 1行ずつ順番に読み込む
ファイルのサイズや、読み込んだ後の処理内容に応じて、これらを適切に使い分けることが重要です。
この記事では、サンプルファイルを使ってそれぞれの動作と使用シーンを解説します。
準備:サンプルファイルの作成
解説用に、以下の内容が記述された todo_list.txt というファイルを使用します。
todo_list.txt
Buy milk
Walk the dog
Read a book
1. read():ファイル全体を文字列として取得
read() メソッドは、ファイルの中身を**ひとつの長い文字列(str型)**として一括で読み込みます。ファイルサイズが小さく、単純に中身を表示したり、テキスト全体に対して検索をかけたりする場合に適しています。
file_path = "todo_list.txt"
with open(file_path, "r", encoding="utf-8") as file_handle:
# ファイル全体を文字列として読み込む
full_text = file_handle.read()
print(f"型: {type(full_text)}")
print("-" * 10)
print(full_text)
実行結果:
型: <class 'str'>
----------
Buy milk
Walk the dog
Read a book
2. readlines():すべての行をリストとして取得
readlines() メソッドは、ファイル全体を読み込み、**改行で区切ったリスト(list型)**として返します。 特定の行(例:1行目だけ、5行目だけ)にアクセスしたい場合や、行単位でループ処理を行いたい場合に便利です。
with open(file_path, "r", encoding="utf-8") as file_handle:
# 各行を要素とするリストを取得
lines_list = file_handle.readlines()
print(f"型: {type(lines_list)}")
print(f"行数: {len(lines_list)}")
print("-" * 10)
# enumerateを使ってインデックス付きで表示
for index, line in enumerate(lines_list):
# ファイル内の改行コードが含まれているため、strip()で除去するか
# printのend=""で調整する
print(f"{index}: {line}", end="")
実行結果:
型: <class 'list'>
行数: 3
----------
0: Buy milk
1: Walk the dog
2: Read a book
注意点:
readlines()はファイル全体をメモリ上のリストに展開するため、巨大なファイルを読み込むとメモリ不足になる可能性があります。
3. readline():1行ずつ読み込む
readline() メソッド(末尾に s がない)は、呼び出すたびにファイルの先頭から1行だけを読み込みます。巨大なファイルを扱う場合や、最初の数行だけを確認したい場合に適しています。
with open(file_path, "r", encoding="utf-8") as file_handle:
print("--- 1行ずつ読み込み ---")
# 1行目を読み込む
first_line = file_handle.readline()
print(f"1: {first_line}", end="")
# 2行目を読み込む
second_line = file_handle.readline()
print(f"2: {second_line}", end="")
# 3行目を読み込む
third_line = file_handle.readline()
print(f"3: {third_line}", end="")
実行結果:
--- 1行ずつ読み込み ---
1: Buy milk
2: Walk the dog
3: Read a book
補足:ファイルオブジェクトを直接ループする(推奨)
もし「ファイルを最初から最後まで1行ずつ処理したい」だけであれば、readlines() や readline() を使わず、ファイルオブジェクトを直接 for 文で回す方法が最も推奨されます(メモリ効率が良く、コードも簡潔です)。
with open(file_path, "r", encoding="utf-8") as file_handle:
# readlines() を使わずに直接ループ
for i, line in enumerate(file_handle, 1):
print(f"Line {i}: {line.strip()}")
実行結果:
Line 1: Buy milk
Line 2: Walk the dog
Line 3: Read a book
まとめ
read(): ファイル全体を「1つの文字列」にする。全文検索などに利用。readlines(): ファイル全体を「文字列のリスト」にする。行へのランダムアクセスに利用。readline(): ファイルを「1行ずつ」読み込む。手動制御や巨大ファイルに利用。for line in f:: 全行を順番に処理する場合は、この方法が最もメモリ効率が良い。
読み込んだ文字列には末尾に改行コード(\n)が含まれているため、print() で出力する際は end="" を指定するか、.strip() メソッドで改行を除去する処理が必要です。
