Python | ファイル操作など:readlines

Python
スポンサーリンク

概要(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)
Python

sizehint で「大まかな読み取り量」を指定できる

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]
Python

readlines と他の読み方の使い分け(深掘り)

「全部を一度に 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(",")
        # 行ごとに処理
Python

read() + 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()]
Python

encoding を必ず明示(原則 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 を使う選択肢もあります。用途に応じて「一括」か「ストリーミング」かを選び分ければ、読み込みのコードは短く、安定して、実務品質に届きます。

タイトルとURLをコピーしました