Вопрос о дескрипторе файла python
Я думаю, что этот вопрос скорее скорее "стиль кодирования", чем технический вопрос.
Сказано, что у меня есть строка кода:
buf = open('test.txt','r').readlines()
...
Будет ли дескриптор файла автоматически закрыт или останется в памяти?
Если дескриптор файла не закрыт, каков предпочтительный способ его закрытия?
Ответы
Ответ 1
Если вы назначаете объект файла переменной, вы можете явно закрыть его, используя .close()
f = open('test.txt','r')
buf = f.readlines()
f.close()
В качестве альтернативы (и в более общем случае) вы можете использовать ключевое слово with
(Python 2.5 и выше), как указано в Python docs:
Рекомендуется использовать with
ключевое слово при работе с файлом объекты. Это имеет то преимущество, что файл правильно закрыт после люкс заканчивается, даже если исключение поднимается по пути. Это также много короче письменного эквивалента try-finally blocks:
>>> with open('test.txt','r') as f:
... buf = f.readlines()
>>> f.closed
True
Ответ 2
Обычно в CPython файл закрывается сразу же, когда счетчик ссылок падает до нуля (хотя это не гарантировано для будущих версий CPython)
В других реализациях, таких как Jython, файл не будет закрыт, пока не будет собрано garbarge, которое может быть долгое время.
Это плохой стиль, чтобы иметь код, который работает по-разному в зависимости от поведения реализации.
Если это просто для quickie script или что-то, что вы пытаетесь использовать в интерпретаторной оболочке, это достаточно хорошо, но для любой производственной работы вы обычно должны использовать диспетчер контекста, как в ответ Falmarri
Ответ 3
Он останется в памяти, пока сборщик мусора не закроет его. Вы всегда должны явно закрывать дескрипторы файлов. Просто сделайте что-нибудь вроде этого:
with open('test.txt', 'r') as f:
buf = f.readlines()
Ответ 4
Он будет автоматически закрыт, но он зависит от реализации именно тогда. Лучше явно использовать с-блок, но если вы просто пишете небольшой script для себя, что вы иногда запускаете, это не имеет большого значения.