Python закрыть файл дескриптор вопрос - PullRequest
19 голосов
/ 05 января 2011

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

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

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

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

Ответы [ 4 ]

38 голосов
/ 05 января 2011

Если вы присваиваете файловый объект переменной, вы можете явно закрыть его, используя .close()

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

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

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

>>> with open('test.txt','r') as f:
...     buf = f.readlines()
>>> f.closed
True
14 голосов
/ 05 января 2011

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

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

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

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

5 голосов
/ 05 января 2011

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

with open('test.txt', 'r') as f:
    buf = f.readlines()
1 голос
/ 05 января 2011

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

...