В одном из прошлых постов был вопрос в комментариях по поводу закрытия файла.
Тогда я бегло пояснил что 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