📜 Как показано в исходном материале
Исходная лекция демонстрирует ручное открытие файла, чтение содержимого и явный вызов close():
# из исходного материала
file = open("example.txt", "r", encoding="utf-8")
content = file.read()
print(content)
file.close()
Этот код корректен, но требует дисциплины: если забыть close() или если между open() и close() возникнет исключение, файл останется открытым.
❌ Что можно улучшить
- Ручной вызов
close()легко забыть, особенно в сложных функциях. - Если в блоке между
open()иclose()произойдёт ошибка, файл может остаться открытым. - В Windows незакрытый файл может блокировать доступ для других программ.
- Ручное управление ресурсами делает код многословнее и менее безопасным.
✅ Рекомендуемый современный вариант
# modern_read.py
with open("example.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
# file.close() вызывается автоматически
Что улучшилось:
- Автоматическое закрытие файла при выходе из блока
with. - Безопасность при ошибках: файл закроется даже если внутри блока возникнет исключение.
- Читаемость: границы работы с файлом чётко обозначены отступами.
- Меньше ошибок: невозможно забыть вызвать
close().
Современный подход к нескольким файлам
# modern_copy.py
with (
open("source.txt", "r", encoding="utf-8") as src,
open("dest.txt", "w", encoding="utf-8") as dst,
):
dst.write(src.read())
Оба файла открываются и закрываются автоматически. Это заменяет более длинную конструкцию с try/finally.
pathlib для простых случаев
pathlib и методы Path.read_text() / Path.write_text() не разбираются в исходной лекции, но являются современным способом работы с небольшими текстовыми файлами в Python 3.
# pathlib_demo.py
from pathlib import Path
# Прочитать весь файл одной строкой
content = Path("example.txt").read_text(encoding="utf-8")
print(content)
# Записать строку в файл
Path("output.txt").write_text("Hello, pathlib!\n", encoding="utf-8")
pathlib удобен для простых операций «прочитать всё / записать всё», но для построчной обработки больших файлов всё ещё лучше подходит with open(...).
📊 Сравнение подходов
| Подход | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
open() / close() |
Понятно новичкам. | Легко забыть close(); риск утечки ресурсов. | Учебные примеры, быстрые скрипты. |
with open(...) |
Авто-закрытие, безопасность, читаемость. | Нужно понимать менеджеры контекста. | Практически всегда. |
pathlib.Path.read_text/write_text |
Кратко, удобно для небольших файлов. | Загружает весь файл в память. | Небольшие текстовые файлы, конфиги. |
🕰️ Когда старый подход ещё можно встретить
Учебные примеры, устаревшие кодовые базы и быстрые скристы иногда используют ручное open() / close(). В домашних заданиях и реальных проектах рекомендуется применять with open(...).