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