概要(readlines は「全ての行を一度にリストで受け取る」ためのメソッド)
readlines は、open で開いたファイルオブジェクトから「全行」をまとめて読み込み、各行を要素とするリストを返します。戻り値の各文字列には行末の改行が含まれるのが基本です(テキストモードでは改行は標準化されます)。小さめのファイルや「一度に全行をメモリに載せて後でまとめて処理したい」場面で向いています。
with open("memo.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
print(lines[:3]) # ['一行目\n', '二行目\n', '三行目\n']
Python基本の使い方と性質(ここが重要)
返り値は「リスト」、各要素は「1行の文字列(改行付き)」
readlines() は list[str] を返します。要素には末尾の改行が入るため、表示や比較の前には strip() または rstrip(“\n”) を使うのが定石です。
with open("names.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
names = [line.strip() for line in lines]
print(names)
Pythonsizehint で「大まかな読み取り量」を指定できる
readlines(sizehint) の引数に整数を渡すと、内部バッファの目安として使われ、概ねそのバイト数に近い分だけの行を返します(厳密な行数・サイズではありません)。巨大ファイルを段階的に読みたいときに役立ちます。
with open("large.log", "r", encoding="utf-8") as f:
chunk = f.readlines(1024 * 1024) # だいたい1MB相当まで
# chunk は「複数行のリスト」。残りは次回呼び出しで続きが読める
Pythonテキストとバイナリで振る舞いが変わる
テキストモード(”r”)では str を、バイナリモード(”rb”)では bytes のリストを返します。画像やZIPなどは必ず “rb” を使い、文字列処理は行わないようにします。
with open("data.bin", "rb") as f:
parts = f.readlines() # list[bytes]
Pythonreadlines と他の読み方の使い分け(深掘り)
「全部を一度に memory に載せたい」なら readlines、「流しながら処理」なら行反復
- readlines(): 全行リスト化。後でまとめてフィルタやソート、n行目へのランダムアクセスが簡単。
- for line in f: 行反復。省メモリで高速。巨大ファイルではこちらが基本線。
- readline(): 1行ずつ明示的に取り出す。長い行に size をかけて分割するなど、細かい制御が可能。
# 省メモリで安定:推奨は行反復
with open("data.csv", "r", encoding="utf-8", newline="") as f:
for line in f:
row = line.rstrip("\n").split(",")
# 行ごとに処理
Pythonread() + splitlines() という選択肢
ファイル全体を文字列で受けてから splitlines(True/False) で行に分割する方法もあります。改行の扱いを自分で選べるのが利点ですが、メモリは readlines と同様に全量を使います。
with open("small.txt", "r", encoding="utf-8") as f:
text = f.read()
lines = text.splitlines() # 改行除去で分割(True なら改行保持)
Python実務での設計ポイント(メモリ、改行、エンコーディング)
巨大ファイルでは「readlines は避けて行反復」が基本
readlines は全行をメモリに載せるため、サイズが大きいと MemoryError や極端な遅延に繋がります。まずは for line in f で処理し、必要なら部分集計・ストリーミング書き出しに切り分けます。
def count_non_empty(path: str) -> int:
n = 0
with open(path, "r", encoding="utf-8") as f:
for line in f:
if line.strip():
n += 1
return n
Python改行は含まれる前提で「strip を習慣に」
readlines の要素は改行を含むのが基本です。表示や比較、split の前に strip()/rstrip(“\n”) を入れると事故が減ります。書き戻し時は newline=”\n” を使うとプラットフォーム差を均一化できます。
with open("log.txt", "r", encoding="utf-8", newline="\n") as f:
rows = [line.strip() for line in f.readlines()]
Pythonencoding を必ず明示(原則 UTF-8、混在時は errors 指定)
日本語を安全に扱うなら “utf-8″ を常に指定。外部由来で文字コードが怪しい場合は errors=”replace” を付けて読み進め、上流データの是正を検討します。
with open("unknown.txt", "r", encoding="utf-8", errors="replace") as f:
lines = f.readlines()
Python例題で身につける(定番から一歩先まで)
例題1:全行を読み込み、前後空白を除去して整形
def load_lines(path: str) -> list[str]:
with open(path, "r", encoding="utf-8") as f:
return [line.strip() for line in f.readlines()]
Python例題2:sizehint を使って段階的に読む(大きめファイルの緩和策)
def read_in_chunks(path: str, hint: int = 1 << 20) -> list[list[str]]:
chunks: list[list[str]] = []
with open(path, "r", encoding="utf-8") as f:
while True:
part = f.readlines(hint)
if not part:
break
chunks.append(part)
return chunks
Python例題3:ヘッダ行を取り除いてデータだけを取得
def load_data_without_header(path: str) -> list[str]:
with open(path, "r", encoding="utf-8") as f:
lines = f.readlines()
return [line.strip() for line in lines[1:]] # 先頭1行を除去
Python例題4:CSV を readlines で読み、辞書の配列に変換
def read_csv_dicts(path: str) -> list[dict[str, str]]:
with open(path, "r", encoding="utf-8", newline="") as f:
lines = [line.rstrip("\n") for line in f.readlines()]
header = lines[0].split(",")
rows: list[dict[str, str]] = []
for line in lines[1:]:
values = line.split(",")
rows.append(dict(zip(header, values)))
return rows
Pythonまとめ
readlines は「全ての行を一度にリストで」受け取るメソッドで、後処理をまとめて行いたい場面に便利です。各要素には改行が含まれるため、strip を習慣化し、エンコーディングは原則 UTF-8 を明示。巨大ファイルではメモリの都合から行反復(for line in f)へ切り替える判断が重要で、段階的に読みたいときは sizehint を使う選択肢もあります。用途に応じて「一括」か「ストリーミング」かを選び分ければ、読み込みのコードは短く、安定して、実務品質に届きます。
