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

Для строки в открытом (имя файла)

Я часто вижу код python, похожий на

for line in open(filename):
    do_something(line)

Когда имя файла закрывается с помощью этого кода?

Было бы лучше написать

with open(filename) as f:
    for line in f.readlines():
        do_something(line)
4b9b3361

Ответ 1

filename будет закрыт, когда он выпадет из сферы действия. Обычно это будет конец метода.

Да, лучше использовать with.

Как только у вас есть файловый объект, вы выполняете все операции ввода-вывода файлов, вызывая методы этого объекта. [...] Когда вы закончите с файлом, вы должны закончить, вызвав метод close объекта, чтобы закрыть соединение с файлом:

input.close()

В коротких сценариях люди часто опускают этот шаг, так как Python автоматически закрывает файл, когда файл-объект регенерируется во время сбора мусора (который в основном Python означает, что файл закрыт примерно сразу, хотя другие важные реализации Python, такие как как Jython и IronPython, имеют другие, более расслабленные стратегии сбора мусора). Тем не менее, хорошая практика программирования заключается в том, чтобы как можно скорее закрыть ваши файлы, и это особенно хорошая идея в более крупных программах, которые в противном случае могут быть более подвержены риску чрезмерного количества бесполезно открытых файлов. Обратите внимание, что try/finally особенно хорошо подходит для последующего закрытия файла, даже когда функция завершается из-за неперехваченного исключения.

Поваренная книга Python, Страница 59.

Ответ 2

Часть with лучше, потому что впоследствии она закрывает файл. Вам даже не нужно использовать readlines(). for line in file достаточно.

Я не думаю, что первая закрывает его.

Ответ 3

Отбрасывание .readlines(). Он избыточен и нежелателен для больших файлов (из-за потребления памяти). Вариант с блоком 'with' всегда закрывает файл.

with open(filename) as file_:
    for line in file_:
        do_something(line)

Когда файл будет закрыт в голой версии 'for' -loop, зависит от реализации Python.

Ответ 4

python - сбор мусора - cpython имеет подсчет ссылок и цикл резервного копирования, обнаруживающий сборщик мусора.

Файловые объекты закрывают свой дескриптор файла, когда они удаляются/завершаются.

Таким образом, файл будет закрыт, и в cpython будет закрыт, как только цикл for завершится.