Модуль 8 · Исключения и файлы

Справочник по Python · модуль 8 · исключения и файлы

Глава 8.9

8.9

Чтение:
readline()

Метод читает файл по одной строке за вызов и возвращает её вместе с завершающим переводом строки. Конец файла обозначается пустой строкой — и отличать её от пустой строки внутри файла нужно аккуратно.

Категория
Файлы
Уровень
Базовый
Связанные темы
Строки, позиция в файле, циклы
Зачем это знать
Читать файл построчно, не загружая его целиком

§1Одна строка за вызов

readline() читает от текущей позиции до ближайшего перевода строки и возвращает прочитанное. Позиция сдвигается на начало следующей строки.

main.pyдва вызова подряд
with open("demo.txt", encoding="utf-8") as file:
    print(repr(file.readline()))
    print(repr(file.readline()))
Выводвторая строка продолжила с места остановки
'первая строка\n'
'вторая строка\n'

Это тот же механизм позиции, что в главе 8.8, только шаг определяется не числом символов, а разделителем строк.

§2Перевод строки сохраняется

Символ \n входит в результат — это часть прочитанной строки, а не служебная метка.

main.pyпечать без repr() скрывает деталь
with open("demo.txt", encoding="utf-8") as file:
    line = file.readline()

print(line)
print("конец")
Выводлишняя пустая строка от двух переводов
первая строка

конец

Один перевод пришёл из файла, второй добавил print(). Чтобы этого избежать, строку очищают методом strip() из главы 5.9 или печатают с end="".

§3Последняя строка и конец файла

Если файл не заканчивается переводом строки, последняя строка вернётся без него. А когда читать больше нечего — возвращается пустая строка.

main.pyчетыре вызова на файл из трёх строк
with open("demo.txt", encoding="utf-8") as file:
    for _ in range(4):
        print(repr(file.readline()))
Выводчетвёртый вызов вернул пустоту
'первая строка\n'
'вторая строка\n'
'третья строка\n'
''

§4Признак конца файла

Пустая строка и есть сигнал остановки — исключения не будет. Но здесь кроется тонкость.

Что вернулосьЧто это значит
'текст\n'обычная строка
'\n'пустая строка в файле — читать ещё есть что
''файл закончился

Различие между второй и третьей строками принципиально: '\n' — это непустая строка длиной один символ. Поэтому проверка if not line работает верно, а вот if not line.strip() оборвёт чтение на первой же пустой строке файла.

§5Цикл по строкам

main.pyчтение до конца файла
with open("demo.txt", encoding="utf-8") as file:
    while True:
        line = file.readline()
        if not line:
            break
        print(line.strip())
Выводstrip() убрал переводы
первая строка
вторая строка
третья строка

Конструкция знакома по главе 8.8 — там так же читали блоками. Разница только в том, что порция здесь определяется концом строки.

§6readline(size)

Аргумент ограничивает длину: метод вернёт не больше указанного числа символов, даже если строка длиннее.

main.pyограничение в пять символов
with open("demo.txt", encoding="utf-8") as file:
    print(repr(file.readline(5)))
    print(repr(file.readline(5)))
Выводстрока обрезана, перевод не достигнут
'перва'
'я стр'

Результат совпал с read(5) из главы 8.8 — и это не совпадение: пока до перевода строки далеко, оба метода ведут себя одинаково.

§7Ограничение внутри строки

Разница проявляется, когда перевод строки встречается раньше лимита.

Что раньшеreadline(size) вернёт
перевод строкистроку целиком, включая \n
лимит sizeровно size символов без \n

Значит, по наличию \n в конце можно понять, дочитана строка или обрезана. Аргумент нужен как защита от файлов с аномально длинными строками: без него одна строка на гигабайт попадёт в память целиком.

§8readline() или перебор файла

В главе 8.8 упоминался более короткий способ читать построчно — перебор самого файлового объекта.

Сравнениеодин результат, две записи
while True:                   for line in file:
    line = file.readline()        print(line.strip())
    if not line:
        break
    print(line.strip())
СпособКогда предпочесть
for line in fileобычное чтение всех строк подряд
readline()нужно прочитать ровно одну строку
readline()строки читаются неравномерно, по условию
readline(size)защита от слишком длинных строк

Практическое правило: если нужно просто пройти по всем строкам — for. readline() берут там, где чтением управляют вручную.

§9Практика: заголовок и данные

Задача, где readline() уместнее перебора: первая строка файла — заголовок, остальные — данные.

main.pyшапка читается отдельно
with open("table.txt", "w", encoding="utf-8") as file:
    file.write("имя;балл\nАнна;95\nМакс;82\n")

with open("table.txt", encoding="utf-8") as file:
    header = file.readline().strip()
    print("колонки:", header.split(";"))

    for line in file:
        name, score = line.strip().split(";")
        print(name, score)
Выводзаголовок не попал в данные
колонки: ['имя', 'балл']
Анна 95
Макс 82

Приём работает потому, что оба способа чтения используют одну и ту же позицию: readline() сдвинул её на вторую строку, и цикл продолжил оттуда.

§10Двоичный режим

В режиме "rb" метод возвращает bytes и ищет байт 0x0A — тот самый \n.

main.pyпервая строка как байты
with open("demo.txt", "rb") as file:
    print(file.readline())
Выводперевод строки в конце виден как \n
b'\xd0\xbf\xd0\xb5\xd1\x80\xd0\xb2\xd0\xb0\xd1\x8f \xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0\n'

Здесь size считается в байтах, и обрезка может разорвать символ пополам — та же опасность, что в главе 8.8.

§11Сравнение методов чтения

МетодВозвращаетПамять
read()весь файл одной строкойвесь файл
read(size)порцию символоводна порция
readline()одну строку с \nодна строка
readlines()список всех строквесь файл
for line in fileстроки по однойодна строка

Правая колонка объясняет выбор для больших файлов: безопасны только те способы, где в памяти держится одна порция. readlines() разбирается в следующей главе.

§12Частые ошибки

Что написаноЧто произойдётКак правильно
print(file.readline())лишняя пустая строка в выводе.strip() или end=""
if not line.strip(): breakчтение оборвётся на пустой строке файлаif not line: break
сравнивать строку с "текст" без strip()не совпадёт из-за \nочистить перед сравнением
readline() в цикле for line in fileстроки будут пропускатьсявыбрать один способ
while file.readline(): с обработкой внутристрока прочитана, но потерянасохранять результат в переменную
читать построчно файл без переводов строквесь файл окажется одной строкойreadline(size)

§13Проверьте себя

Входит ли \n в результат readline()?

Да, если строка в файле им заканчивалась. Последняя строка файла может вернуться без него.

Как отличить конец файла от пустой строки в файле?

Конец файла — это '', пустая строка в файле — '\n', то есть один символ. Проверять нужно if not line, без strip().

Что делает аргумент size?

Ограничивает длину результата. Если перевод строки встретится раньше, вернётся строка целиком; если позже — ровно size символов без \n.

Когда readline() лучше перебора for line in file?

Когда нужно прочитать ровно одну строку — например, заголовок — или когда чтением управляют вручную.

Почему после readline() цикл for продолжает со второй строки?

Оба способа используют одну позицию в файле, и readline() её уже сдвинул.

Сколько памяти занимает readline()?

Одну строку. Поэтому он, как и построчный перебор, безопасен для файлов любого размера.

§14Шпаргалка

Одна строкаline = file.readline()
Без переводаfile.readline().strip()
Конец файлаif not line: break
С ограничениемfile.readline(1024)
Заголовок и данныеheader = file.readline()
Все строкиfor line in file:

Итог главы

readline() возвращает одну строку вместе с завершающим \n и сдвигает позицию к следующей. Конец файла обозначается пустой строкой, и отличать её от пустой строки внутри файла нужно без strip(): там будет '\n', а не ''. Аргумент size ограничивает длину и защищает от аномально длинных строк. Для обычного прохода по всем строкам короче перебор файлового объекта, а readline() берут, когда чтением управляют вручную.

Глава 8.9 · Чтение: readline() · Справочник по Python Автор: Макаров Максим Николаевич