Теория:
Для автоматизации работы с файлами удобно использовать контекстный менеджер with…as. Тогда нет необходимости закрывать файл, а в случае ошибки внутри программы, вне зависимости от того, закончится работа с файлом или нет, файл будет автоматически закрыт, и нам не грозит потеря в нём информации.
Рассмотрим работу с менеджером контекста:
with open('input.txt') as input_file:
with open('output.txt', 'w') as output_file:
В этом примере мы выполнили открытие файла и сохранили его как input_file, и теперь доступ к содержимому файла доступен по этому имени внутри блока with.

Рис. \(1\). Пример открытия и сохранения файла
На скриншоте ты видишь пример работы контекстного менеджера, файл input.txt, фрагмент программы, который выводит в файл output.txt наибольшее количество букв «ш» и номер строки, в которой наибольшее количество искомых букв содержится.
Источники:
Рис. 1. Пример открытия и сохранения файла. © ЯКласс.