Файлы в Python: чтение и запись текста
Автор: Казачкин Даниил Михайлович · Обновлено
Файл позволяет сохранить данные между запусками. Конструкция with open открывает ресурс и гарантирует закрытие после выхода из блока, даже если возникла ошибка. Режим r читает существующий файл, w создаёт новый или полностью перезаписывает старый.
Подсчёт непустых строк
Пусть input.txt содержит три строки, средняя из которых пустая.
with open('input.txt', 'r', encoding='utf-8') as source:
lines = source.readlines()
non_empty = sum(1 for line in lines if line.strip())
with open('output.txt', 'w', encoding='utf-8') as target:
target.write(str(non_empty))
print(non_empty)В консоли и output.txt окажется число 2. readlines сохраняет символы перевода строки, а strip используется только для проверки содержимого.
Путь считается от рабочей папки
FileNotFoundError часто означает, что input.txt лежит не в текущей рабочей директории. Выведите путь через модуль pathlib или проверьте терминал, из которого запущена программа. Не путайте расположение исходного файла с автоматически выбранной папкой запуска редактора.
Режим w опасен для существующих данных: содержимое обнуляется при открытии. Для добавления в конец существует a. Всегда указывайте encoding='utf-8' для предсказуемой работы русского текста. Не пытайтесь читать из объекта file после завершения with — он уже закрыт.
Практика с проверяемым файлом
Создайте input.txt с числами по одному в строке. Прочитайте их, найдите сумму и запишите в result.txt строку «Сумма: ...». Проверьте файл из одного числа, отрицательные значения и пустой файл; для пустого ожидается ноль. После запуска откройте result.txt и убедитесь, что повторный запуск в режиме w не дублирует строку.
Файл как внешний ресурс
Проведите два запуска программы записи: сначала в режиме w, затем в a. Перед каждым предскажите содержимое файла и после прочитайте его обратно. Добавьте перевод строки явно, чтобы записи не склеились. Затем переименуйте входной файл и обработайте FileNotFoundError на уровне пользовательского сценария, не окружая try всем кодом. Через pathlib.Path проверьте существование и выведите абсолютный путь для диагностики. Завершите эксперимент временным файлом с русским текстом, подтверждая UTF-8. В отчёте разделите ошибки данных, пути и выбранного режима открытия.
Практикум: файл с явной кодировкой и контекстом
Запишите три русские строки в файл с encoding="utf-8", затем прочитайте их целиком и построчно. Используйте with, после блока проверьте, что работа с закрытым файлом вызывает ошибку. Сравните режимы w и a на копии данных: первый перезаписывает содержимое, второй добавляет. Подготовьте пустой файл и последнюю строку без перевода. Для подсчёта непустых строк удаляйте только нужные символы и не теряйте внутренние пробелы.
Контрольная точка
Какие ресурсы освобождает контекстный менеджер даже при ошибке внутри блока? Объясните, почему закрытие файла важно не только для чтения, но и для гарантированной записи буфера.
Частые вопросы
Почему стоит указывать encoding явно?
Кодировка по умолчанию зависит от окружения. Явный UTF-8 делает файл переносимым и предотвращает ситуацию, когда программа работает на одном компьютере, но не может прочитать те же символы на другом.