Коли файли закриваються?
Як ми можемо дізнатися з Важливе значення явного закриття файлів? (StackOverflow) , інтерпретатор Python закриває файл у таких випадках:
- ви вручну викликаєте
close()
метод file
об’єкта явно або неявно, залишаючи with open(...):
блок. Це працює, звичайно, завжди і на будь-якій реалізації Python.
file
остання посилання на об'єкт була видалена, і тому об'єкт обробляється сміттєзбірником. Це не мовна особливість, а особлива лише реалізація CPython, тому для портативності не покладайтеся на це!
- інтерпретатор Python припиняється. У цьому випадку він повинен закрити всі відкриті ручки файлів. Деякі старіші версії Python3 також надрукували б попередження про те, що ви повинні закрити їх вручну. Однак, уявіть собі крах або ви насильно вбили інтерпретатора Python, і ви побачите, що це також не є надійним.
Тож надійний лише перший (ручний) метод!
Що буде, якщо файл залишається відкритим?
По-перше, залежно від реалізації вашого інтерпретатора Python, якщо ви відкрили файл з доступом до запису, ви не можете бути впевнені, що ваші модифікації перекинулися на диск, поки ви не ввели його вручну або не закриється обробник файлів.
По-друге, ви можете відкривати лише обмежену кількість файлів у вашій системі на кожного користувача. Якщо ви перевищите цей ліміт, наприклад, відкривши багато файлів у циклі у вашій програмі Python, не закриваючи їх якнайшвидше, система може відмовитись відкривати подальші ручки файлів для вас, і ви отримаєте виняток. Також може статися, що ваша програма приймає останній дозволений відкритий файл, а інша програма вийде з ладу, оскільки вона відхиляється.
По-третє, відкриті файли на знімному пристрої запобігають його відключенню або вилученню. Ви все ще можете видалити файл у деяких файлових системах ext4
, де дескриптор файлу / жорстке посилання на індею файлу видаляється / відключається, але програма, яка відкрила файл, все ще може отримати доступ до inode через власний тимчасовий обробник файлів. Це, наприклад, також механізм, який дозволяє оновлювати пакети під час роботи відповідного програмного забезпечення. Однак, наприклад, NTFS не має такої особливості. Однак він може ніколи не змінюватися двома паралельними процесами, тому він все ще буде якось заблокований для інших.
with open (file_name, ...) as variable:
автоматично викликаєclose()
метод, як тільки ви залишите цей блок коду.