TGViewer
Python Заметки Python Заметки @pythonotes · 2.2K subscribers
Post #286 1.67K
В одном из прошлых постов был вопрос в комментариях по поводу закрытия файла.
Тогда я бегло пояснил что Python сам собирает мусор в памяти.

Давайте пройдемся по этому вопросу более внимательно.
Когда вы открываете файл не сохраняя его в переменную, на самом деле файл остаётся открытым. Ссылка на него теряется где-то в памяти пока сборщик мусора не доберется до него.

Давайте сделаем несколько экспериментов. Откроем файл не сохраняя его в переменную и поищем этот объект в памяти.
Для поиска будем использовать вот такую функцию

def check_file():
import io, gc
for obj in gc.get_objects():
if isinstance(obj, io.TextIOWrapper) and \
obj.name == 'testfile':
print('File', obj.name, 'is closed:', obj.closed)
return
print('Not found')

Тест первый: файл, открытый в функции

def func():
open('testfile', 'w')

Вызываем функцию и проверяем наличие файла

>>> func()
>>> check_file()
Not found

Здесь всё предсказуемо. Все локальные переменные функции удаляются когда функция завершится. А при удалении файл закрывается.

Тест второй: теперь откроем файл просто в коде, можно в интерактивной консоли.

open('testfile', 'w')

И снова он не сохранён в переменную, а значит будет удалён сборщиком мусора. Проверим:

>>> check_file()
File testfile is closed: False

Бывалые сразу же скажут, что файл улетел в переменную "_", и будут правы!

>>> print(_)
<_io.TextIOWrapper name='testfile' mode='w' encoding='UTF-8'>

Давайте обнулим её, можно просто распечатать любое число в консоли

>>> 123
>>> print(_)
123

Проверим

>>> check_file()
Not found

➡️ Отсюда вывод: Всегда явно закрывайте файлы! Не рассчитывайте что кто-то (gc) сделает это за вас.
_________________
Мои примеры порой содержат оптимизации в угоду краткости но в ущерб правильности.

#tricks
More from @pythonotes
  1. Sep 21, 2026­ WebAssembly это мощная технология позволяющая загружать практически любое приложение в б…
  2. Aug 17, 2026Не так давно столкнулся с API который в ответе с ошибкой присылал только статус-код. Без п…
  3. Jul 20, 2026У меня основная ОС это Linux. Но нередко требуется делать сборку клиента под Windows. Соби…
  4. Jul 13, 2026В прошлый раз был пример с понижением привелегий процесса. Проблема в том, что обратно под…
  5. Jul 6, 2026Модуль pwd может использоваться для считывания информации о пользователях из базы данных п…
  6. Jun 22, 2026Недавно я реализовал Multi Tenancy систему на FastAPI + SQLAlchemy и пересобрал её в небол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →