Чи потрібне закриття файлу після відкриття його з `open ()` в Python? [зачинено]


9

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

Я читав, що це добре робити, але чи є насправді в цьому потреба? Це просто непотрібний код?

Чи закривається файл автоматично?


1
with open (file_name, ...) as variable:автоматично викликає close()метод, як тільки ви залишите цей блок коду.
Байт-командир

1
Дублікат між веб-сайтами stackoverflow.com/q/7395542/4464570
Байт-командир

@ByteCommander Ви хочете дати свій коментар як відповідь, щоб зробити це питання "вирішеним"?
TellMeWhy

1
У python3файлі автоматично збирається файл після того, як він не має більше посилань.
Яків Влійм

4
Я голосую за те, щоб закрити це питання поза темою, оскільки це загальне питання про Python, що не має зв'язку з сценарієм на Ubuntu. це питання про кращі практики з мови програмування.
тердон

Відповіді:


9

Коли файли закриваються?

Як ми можемо дізнатися з Важливе значення явного закриття файлів? (StackOverflow) , інтерпретатор Python закриває файл у таких випадках:

  • ви вручну викликаєте close()метод fileоб’єкта явно або неявно, залишаючи with open(...):блок. Це працює, звичайно, завжди і на будь-якій реалізації Python.
  • fileостання посилання на об'єкт була видалена, і тому об'єкт обробляється сміттєзбірником. Це не мовна особливість, а особлива лише реалізація CPython, тому для портативності не покладайтеся на це!
  • інтерпретатор Python припиняється. У цьому випадку він повинен закрити всі відкриті ручки файлів. Деякі старіші версії Python3 також надрукували б попередження про те, що ви повинні закрити їх вручну. Однак, уявіть собі крах або ви насильно вбили інтерпретатора Python, і ви побачите, що це також не є надійним.

Тож надійний лише перший (ручний) метод!

Що буде, якщо файл залишається відкритим?

По-перше, залежно від реалізації вашого інтерпретатора Python, якщо ви відкрили файл з доступом до запису, ви не можете бути впевнені, що ваші модифікації перекинулися на диск, поки ви не ввели його вручну або не закриється обробник файлів.

По-друге, ви можете відкривати лише обмежену кількість файлів у вашій системі на кожного користувача. Якщо ви перевищите цей ліміт, наприклад, відкривши багато файлів у циклі у вашій програмі Python, не закриваючи їх якнайшвидше, система може відмовитись відкривати подальші ручки файлів для вас, і ви отримаєте виняток. Також може статися, що ваша програма приймає останній дозволений відкритий файл, а інша програма вийде з ладу, оскільки вона відхиляється.

По-третє, відкриті файли на знімному пристрої запобігають його відключенню або вилученню. Ви все ще можете видалити файл у деяких файлових системах ext4, де дескриптор файлу / жорстке посилання на індею файлу видаляється / відключається, але програма, яка відкрила файл, все ще може отримати доступ до inode через власний тимчасовий обробник файлів. Це, наприклад, також механізм, який дозволяє оновлювати пакети під час роботи відповідного програмного забезпечення. Однак, наприклад, NTFS не має такої особливості. Однак він може ніколи не змінюватися двома паралельними процесами, тому він все ще буде якось заблокований для інших.


Не зовсім вірно для python3 !!
Яків Влійм

@JacobVlijm Ви не проти пояснити це?
Байт-командир

Дивіться коментар нижче питання. Відповідь про "непогану практику" за посиланням вашої відповіді - з 2011 року. Якщо вона коли-небудь існувала, попередження python3вже не існує, а відповідь застаріла. Автоматичне збирання сміття існує з причини і працює чудово. Минуло роки, як я close()спеціально використовував . Ніколи не стикався з жодною помилкою, спричиненою невикористанням.
Яків Влійм

Soo ... Ви знаєте, чи закривають інші програми, такі як PyPy, Jython або IronPython, аналогічно CPython? І якби я вбив перекладача, у нього не було б шансу закрити файл, правда? І я також думаю, що ліміт відкритого файлу все ще діє. А що з промиванням письмових даних? Ви знаєте що-небудь більш сучасне там?
Байт-командир

1
@JacobVlijm Дякую за пораду. : P Моя машина вже вийшла з ладу під час створення цього файлу ... Мені навіть для цього Python не потрібен.
Байт-командир
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.