Глава 15 · Python и файлы
Читаем файлы: read(), readline(), readlines()
Один и тот же файл можно прочитать по-разному — и выбор способа — это выбор, а не формальность.
read() — весь файл целиком
read_ves.py
with open("spisok.txt", "r", encoding="utf-8") as f:
content = f.read()
read() — не всегда плохо
Для небольших файлов читать всё сразу — просто и удобно. Для очень больших файлов (гигабайты логов) это может занять много памяти — тогда лучше читать построчно или порциями (раздел 15.23). Не одно решение всегда правильное — важно выбирать под задачу.
readline() — по одной строке
readline.py
with open("spisok.txt", "r", encoding="utf-8") as f:
print(f.readline()) # первая строка
print(f.readline()) # вторая строка
# ...
print(repr(f.readline())) # '' — когда строк больше нет
Debug Lab 4: read() вместо readline()
odna_stroka.py
with open("spisok.txt", "r", encoding="utf-8") as f:
first_line = f.read() # хотели одну строку
second_line = f.read()
print("Первая:", first_line)
print("Вторая:", repr(second_line))
Первая: яблоки\nхлеб\nмолоко\nсыр\n
Вторая: ''
Ожидалось, что каждый вызов вернёт одну строку — но read() без аргумента читает весь оставшийся файл, а не одну строку. Курсор сразу оказался в конце, и второй вызов вернул пустую строку.
Исправленный код
odna_stroka_fixed.py
with open("spisok.txt", "r", encoding="utf-8") as f:
first_line = f.readline()
second_line = f.readline()
print("Первая:", first_line.strip())
print("Вторая:", second_line.strip())
Цикл по файлу — предпочтительный способ
cikl_po_fajlu.py
with open("spisok.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
Объект файла — итерируемый
Как и список или строка (глава 10), объект файла можно обходить циклом
for напрямую — Python сам читает по одной строке за раз, не загружая весь файл в память.readlines() — все строки списком
readlines_spisok.py
with open("spisok.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
print(len(lines), "строк")
| Способ | Что возвращает | Память |
|---|---|---|
for line in file | по одной строке за раз | экономно — подходит для больших файлов |
file.readlines() | список всех строк сразу | весь список строк в памяти одновременно |
Практика: read(), readline(), readlines()
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки