Справочник по Python · модуль 8 · исключения и файлы
Глава 8.9
Чтение:
readline()
Метод читает файл по одной строке за вызов и возвращает её вместе с завершающим переводом строки. Конец файла обозначается пустой строкой — и отличать её от пустой строки внутри файла нужно аккуратно.
- Категория
- Файлы
- Уровень
- Базовый
- Связанные темы
- Строки, позиция в файле, циклы
- Зачем это знать
- Читать файл построчно, не загружая его целиком
§1Одна строка за вызов
readline() читает от текущей позиции до ближайшего перевода строки и возвращает прочитанное. Позиция сдвигается на начало следующей строки.
with open("demo.txt", encoding="utf-8") as file: print(repr(file.readline())) print(repr(file.readline()))
'первая строка\n' 'вторая строка\n'
Это тот же механизм позиции, что в главе 8.8, только шаг определяется не числом символов, а разделителем строк.
§2Перевод строки сохраняется
Символ \n входит в результат — это часть прочитанной строки, а не служебная метка.
with open("demo.txt", encoding="utf-8") as file: line = file.readline() print(line) print("конец")
первая строка конец
Один перевод пришёл из файла, второй добавил print(). Чтобы этого избежать, строку очищают методом strip() из главы 5.9 или печатают с end="".
§3Последняя строка и конец файла
Если файл не заканчивается переводом строки, последняя строка вернётся без него. А когда читать больше нечего — возвращается пустая строка.
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Цикл по строкам
with open("demo.txt", encoding="utf-8") as file: while True: line = file.readline() if not line: break print(line.strip())
первая строка вторая строка третья строка
Конструкция знакома по главе 8.8 — там так же читали блоками. Разница только в том, что порция здесь определяется концом строки.
§6readline(size)
Аргумент ограничивает длину: метод вернёт не больше указанного числа символов, даже если строка длиннее.
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() уместнее перебора: первая строка файла — заголовок, остальные — данные.
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.
with open("demo.txt", "rb") as file: print(file.readline())
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: breakfile.readline(1024)header = file.readline()for line in file:Итог главы
readline() возвращает одну строку вместе с завершающим \n и сдвигает позицию к следующей. Конец файла обозначается пустой строкой, и отличать её от пустой строки внутри файла нужно без strip(): там будет '\n', а не ''. Аргумент size ограничивает длину и защищает от аномально длинных строк. Для обычного прохода по всем строкам короче перебор файлового объекта, а readline() берут, когда чтением управляют вручную.