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