Глава 15 · Python и файлы

Большие файлы и потоковая обработка

Способ чтения файла — это решение, которое должно учитывать его размер.

Размер файла

razmer_fajla.py
from pathlib import Path

path = Path("spisok.txt")
print(path.stat().st_size, "байт")
Размер в байтах — не длина текста
.stat().st_size — это размер в байтах на диске, а не количество символов. Для текста в UTF-8 с кириллицей или эмодзи эти числа, как мы видели в разделе 15.17, обычно не совпадают.

Маленький файл vs большой файл

Выбор способа чтения по размеру файла
Файл заведомо небольшой (настройки, короткая заметка)
read_text() / read() целиком — просто и понятно
Файл может быть очень большим (журнал, лог за год)
построчная обработка — цикл for line in file
readlines() на действительно большом файле
Файл в 1 гигабайт логов — плохой повод для readlines(): весь список строк придётся держать в памяти одновременно. Построчный цикл for line in file обрабатывает файл по одной строке, не накапливая их все сразу.

Чуть глубже: чтение бинарных данных порциями

Для очень больших бинарных файлов иногда читают не всё сразу, а порциями (chunks) фиксированного размера:

chunked_read.py
with open("bolshoy_fajl.bin", "rb") as f:
    while True:
        chunk = f.read(8192)   # порция по 8192 байта
        if not chunk:
            break
        # обработать chunk здесь

Это необязательный, более глубокий материал — для большинства учебных и небольших прикладных задач построчного чтения текста достаточно.

Мини-проект: анализатор текстового файла

Посчитаем строки, слова и символы файла потоково — без загрузки всего файла в память сразу как единой строки:

analizator_fajla.py
from pathlib import Path

def analiz_fajla(path: Path) -> dict[str, int]:
    stroki = 0
    slova = 0
    simvoly = 0
    with path.open("r", encoding="utf-8") as f:
        for line in f:
            stroki += 1
            slova += len(line.split())
            simvoly += len(line)
    return {"строки": stroki, "слова": slova, "символы": simvoly}

print(analiz_fajla(Path("spisok.txt")))
★★ Самостоятельная задача
Байты отдельно

Добавьте в отчёт четвёртое число — размер файла в байтах через .stat().st_size — и сравните его с количеством символов.

Практика: большие файлы и анализатор текста
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →