Python: как прочитать файл построчно (и большой файл тоже)

Категория: Python · Язык: Python · Обновлено:

Самый надёжный способ прочитать файл построчно в Python: открыть его через with open(путь, encoding="utf-8") as f и перебрать for line in f. Файл читается лениво, строка за строкой, поэтому так можно обработать файл любого размера.

Прочитать файл построчно

Python
lines = ["первая строка", "вторая строка", "", "четвёртая строка"]
with open("notes.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(lines) + "\n")

with open("notes.txt", encoding="utf-8") as f:
    for line in f:
        print(repr(line))

Каждая строка содержит символ конца строки \n. Уберите его вместе с пробелами по краям методом rstrip() или strip():

Python
with open("notes.txt", encoding="utf-8") as f:
    clean = [line.rstrip("\n") for line in f]

print(clean)  # ['первая строка', 'вторая строка', '', 'четвёртая строка']

С номерами строк и пропуском пустых

Python
with open("notes.txt", encoding="utf-8") as f:
    for number, line in enumerate(f, start=1):
        text = line.strip()
        if not text:
            continue
        print(number, text)

Всё содержимое сразу

Для небольших файлов удобны три способа:

Python
with open("notes.txt", encoding="utf-8") as f:
    everything = f.read()           # одна строка
with open("notes.txt", encoding="utf-8") as f:
    as_list = f.readlines()         # список строк с символами \n

print(len(everything.splitlines()))  # 4
print(len(as_list))                  # 4

Через pathlib

Python
from pathlib import Path

rows = Path("notes.txt").read_text(encoding="utf-8").splitlines()
print(rows[0])  # первая строка

Метод splitlines() убирает символы конца строки сам. Файл при этом читается целиком, поэтому для больших данных этот вариант не подходит.

Большой файл: по частям и с фильтром

Python
def lines_with(path, word):
    """Лениво отдаёт строки, содержащие слово, не загружая файл в память."""
    with open(path, encoding="utf-8") as f:
        for line in f:
            if word in line:
                yield line.rstrip("\n")

print(list(lines_with("notes.txt", "строка")))  # ['первая строка', 'вторая строка', 'четвёртая строка']

Кодировка

Ситуация

Что указать

Файл в UTF-8

encoding="utf-8"

Файл из Excel с BOM

encoding="utf-8-sig"

Старый файл Windows

encoding="cp1251"

Не уверены, а потерять данные нельзя

errors="replace" вместо ошибки подставит символ замены

Частые вопросы

Почему после for line in f пустая строка в конце?

Это не пустая строка, а символ \n в конце каждой строки. Он остаётся в тексте, пока вы не уберёте его через rstrip("\n").

Чем readlines отличается от перебора файла?

readlines() сразу загружает весь файл в список. Цикл for line in f читает по одной строке и экономит память.