Что касается моего предыдущего вопроса , я заметил, что в обоих ответах, которые использовали open()
функцию, не было упоминания о закрытии файла.
Я читал, что это хорошая практика, но есть ли в этом необходимость? Это просто ненужный код?
Файл закрывается автоматически?
with open (file_name, ...) as variable:
автоматически вызываетclose()
метод, как только вы покидаете этот блок кода.python3
файле создается автоматически, как только у него больше нет ссылок.Ответы:
Когда файлы закрываются?
Как мы можем узнать из Насколько важно явно закрывать файлы? (StackOverflow) , интерпретатор Python закрывает файл в следующих случаях:
close()
методfile
объекта явно или неявно, оставляяwith open(...):
блок. Это работает всегда и на любой реализации Python.file
последняя ссылка на объект была удалена, и поэтому объект обрабатывается сборщиком мусора. Это не языковая функция, а особенность только реализации CPython, поэтому для переносимости не полагайтесь на это!Так что только первый (ручной) метод надежен!
Что произойдет, если файл останется открытым?
Во-первых, в зависимости от реализации вашего интерпретатора Python, если вы открыли файл с доступом для записи, вы не можете быть уверены, что ваши изменения были сброшены на диск, пока вы не вызовете его вручную или не закроете обработчик файла.
Во-вторых, вы можете открыть только ограниченное количество файлов в вашей системе для каждого пользователя. Если вы превысите этот лимит, например, открыв множество файлов в цикле в своей программе Python, не закрывая их как можно скорее, система может отказать вам в открытии дополнительных дескрипторов файлов, и вы получите исключение. Также может случиться так, что ваша программа получит последний разрешенный открытый файл, и другая программа потерпит неудачу из-за отклонения.
В-третьих, открытые файлы на съемном устройстве предотвращают его размонтирование или извлечение. Вы все еще можете удалить файл в некоторых файловых системах, например
ext4
, где просто дескриптор файла / жесткая ссылка на индекс файла удаляется / не связывается, но программа, открывшая файл, может по-прежнему получать доступ к индексу через свой собственный временный обработчик файла. Это, например, также механизм, который позволяет обновлять пакеты во время работы соответствующего программного обеспечения. Однако, например, NTFS не имеет такой функции. Однако он никогда не может быть изменен двумя параллельными процессами, поэтому он все равно будет каким-то образом заблокирован для других.источник
python3
больше не существует, и ответ устарел. Автоматическая сборка мусора существует не просто так и работает отлично. Прошло много лет с тех пор, как я использовалclose()
специально. Никогда не сталкивался ни с одной ошибкой, вызванной неиспользованием.