Требуется ли закрытие файла после его открытия с помощью `open ()` в Python? [закрыто]

9

Что касается моего предыдущего вопроса , я заметил, что в обоих ответах, которые использовали open()функцию, не было упоминания о закрытии файла.

Я читал, что это хорошая практика, но есть ли в этом необходимость? Это просто ненужный код?

Файл закрывается автоматически?

Скажи мне почему
источник
1
with open (file_name, ...) as variable:автоматически вызывает close()метод, как только вы покидаете этот блок кода.
Byte Commander
1
Межсайтовый дубликат stackoverflow.com/q/7395542/4464570
Byte Commander
@ByteCommander Вы хотите дать свой комментарий в качестве ответа, чтобы этот вопрос был «решен»?
TellMeWhy
1
В python3файле создается автоматически, как только у него больше нет ссылок.
Джейкоб Влейм
4
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что это общий вопрос о Python без связи со сценариями в Ubuntu. это спрашивает о лучших практиках в языке программирования.
тердон

Ответы:

9

Когда файлы закрываются?

Как мы можем узнать из Насколько важно явно закрывать файлы? (StackOverflow) , интерпретатор Python закрывает файл в следующих случаях:

  • Вы вручную вызываете close()метод fileобъекта явно или неявно, оставляя with open(...):блок. Это работает всегда и на любой реализации Python.
  • fileпоследняя ссылка на объект была удалена, и поэтому объект обрабатывается сборщиком мусора. Это не языковая функция, а особенность только реализации CPython, поэтому для переносимости не полагайтесь на это!
  • интерпретатор Python завершается. В этом случае он должен закрыть все файловые дескрипторы, которые были открыты. Некоторые старые версии Python3 также выводили предупреждение о том, что вы должны закрывать их вручную. Однако представьте, что произошел сбой или вы принудительно убили интерпретатора Python, и вы увидите, что это также ненадежно.

Так что только первый (ручной) метод надежен!

Что произойдет, если файл останется открытым?

Во-первых, в зависимости от реализации вашего интерпретатора Python, если вы открыли файл с доступом для записи, вы не можете быть уверены, что ваши изменения были сброшены на диск, пока вы не вызовете его вручную или не закроете обработчик файла.

Во-вторых, вы можете открыть только ограниченное количество файлов в вашей системе для каждого пользователя. Если вы превысите этот лимит, например, открыв множество файлов в цикле в своей программе Python, не закрывая их как можно скорее, система может отказать вам в открытии дополнительных дескрипторов файлов, и вы получите исключение. Также может случиться так, что ваша программа получит последний разрешенный открытый файл, и другая программа потерпит неудачу из-за отклонения.

В-третьих, открытые файлы на съемном устройстве предотвращают его размонтирование или извлечение. Вы все еще можете удалить файл в некоторых файловых системах, например ext4, где просто дескриптор файла / жесткая ссылка на индекс файла удаляется / не связывается, но программа, открывшая файл, может по-прежнему получать доступ к индексу через свой собственный временный обработчик файла. Это, например, также механизм, который позволяет обновлять пакеты во время работы соответствующего программного обеспечения. Однако, например, NTFS не имеет такой функции. Однако он никогда не может быть изменен двумя параллельными процессами, поэтому он все равно будет каким-то образом заблокирован для других.

Byte Commander
источник
Не совсем верно для python3 !!
Джейкоб Влейм
@JacobVlijm Не могли бы вы объяснить это?
Byte Commander
Смотрите комментарий под вопросом. Ответ о «не очень хорошей практике» в ссылке на ваш ответ - с 2011 года. Если он когда-либо существовал, предупреждение python3больше не существует, и ответ устарел. Автоматическая сборка мусора существует не просто так и работает отлично. Прошло много лет с тех пор, как я использовал close()специально. Никогда не сталкивался ни с одной ошибкой, вызванной неиспользованием.
Джейкоб Влейм
Так ... Вы знаете, закрывают ли другие реализации, такие как PyPy, Jython или IronPython, таким же образом, как CPython? И если бы я убил переводчика, у него не было бы возможности закрыть файл, верно? И я также думаю, что лимит открытого файла все еще применяется. Как насчет очистки записанных данных? Вы знаете что-нибудь более современное там?
Byte Commander
1
@JacobVlijm Спасибо за совет. : P Моя машина уже разбилась при создании этого файла ... Мне даже не нужен Python для этого.
Byte Commander