вопрос о закрытии дескриптора файла python

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

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

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

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

4 ответов


если вы назначаете объект file переменной, вы можете явно закрыть его с помощью .close()

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

альтернативно (и более предпочтительно), вы можете использовать with ключевое слово (Python 2.5 и выше) как говорится в Python docs:

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

>>> with open('test.txt','r') as f:
...     buf = f.readlines()
>>> f.closed
True

обычно в CPython файл закрывается сразу же, когда счетчик ссылок падает до нуля (хотя это поведение не гарантируется для будущих версий CPython)

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

Это плохой стиль, чтобы иметь код, который работает по-разному в зависимости от поведения реализации.

Если это только для сценария quickie или что-то вы пытаетесь в оболочке интерпретатора, это достаточно хорошо, но для любой производственной работы вы обычно должны использовать контекстный менеджер, как в ответе Falmarri


Он останется в памяти, пока сборщик мусора не закроет его. Всегда следует явно закрывать файловые дескрипторы. Просто сделайте что-нибудь вроде этого:

with open('test.txt', 'r') as f:
    buf = f.readlines()

Он будет автоматически закрыт, но это зависит от реализации, когда именно. Лучше явно использовать with-block, Но если вы просто пишете для себя небольшой скрипт, который вы иногда запускаете, это не имеет значения.