Подтвердить что ты не робот

Вопрос о дескрипторе файла python

Я думаю, что этот вопрос скорее скорее "стиль кодирования", чем технический вопрос.

Сказано, что у меня есть строка кода:

buf = open('test.txt','r').readlines()
...

Будет ли дескриптор файла автоматически закрыт или останется в памяти? Если дескриптор файла не закрыт, каков предпочтительный способ его закрытия?

4b9b3361

Ответ 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 для себя, что вы иногда запускаете, это не имеет большого значения.