⚖️ Старый и современный подход

⚡ Различия в двух словах

Из источника: ручное открытие и закрытие файла через open() и close().

Современная практика: использование контекстного менеджера with open(...) as f, который гарантирует закрытие файла.

Дополнительно: для простых операций можно использовать pathlib.Path.read_text() и write_text().

Вывод: используйте with, чтобы не забыть закрыть файл и избежать утечек ресурсов.

📜 Как показано в исходном материале

Исходная лекция демонстрирует ручное открытие файла, чтение содержимого и явный вызов 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(...).