Я часто вижу код python, похожий на
for line in open(filename):
do_something(line)
Когда имя файла закрывается с помощью этого кода?
Было бы лучше написать
with open(filename) as f:
for line in f.readlines():
do_something(line)
Я часто вижу код python, похожий на
for line in open(filename):
do_something(line)
Когда имя файла закрывается с помощью этого кода?
Было бы лучше написать
with open(filename) as f:
for line in f.readlines():
do_something(line)
filename
будет закрыт, когда он выпадет из сферы действия. Обычно это будет конец метода.
Да, лучше использовать with
.
Как только у вас есть файловый объект, вы выполняете все операции ввода-вывода файлов, вызывая методы этого объекта. [...] Когда вы закончите с файлом, вы должны закончить, вызвав метод
close
объекта, чтобы закрыть соединение с файлом:input.close()
В коротких сценариях люди часто опускают этот шаг, так как Python автоматически закрывает файл, когда файл-объект регенерируется во время сбора мусора (который в основном Python означает, что файл закрыт примерно сразу, хотя другие важные реализации Python, такие как как Jython и IronPython, имеют другие, более расслабленные стратегии сбора мусора). Тем не менее, хорошая практика программирования заключается в том, чтобы как можно скорее закрыть ваши файлы, и это особенно хорошая идея в более крупных программах, которые в противном случае могут быть более подвержены риску чрезмерного количества бесполезно открытых файлов. Обратите внимание, что
try
/finally
особенно хорошо подходит для последующего закрытия файла, даже когда функция завершается из-за неперехваченного исключения.
Часть with
лучше, потому что впоследствии она закрывает файл.
Вам даже не нужно использовать readlines()
. for line in file
достаточно.
Я не думаю, что первая закрывает его.
Отбрасывание .readlines()
. Он избыточен и нежелателен для больших файлов (из-за потребления памяти). Вариант с блоком 'with'
всегда закрывает файл.
with open(filename) as file_:
for line in file_:
do_something(line)
Когда файл будет закрыт в голой версии 'for'
-loop, зависит от реализации Python.
python - сбор мусора - cpython имеет подсчет ссылок и цикл резервного копирования, обнаруживающий сборщик мусора.
Файловые объекты закрывают свой дескриптор файла, когда они удаляются/завершаются.
Таким образом, файл будет закрыт, и в cpython будет закрыт, как только цикл for завершится.