Линейная обработка файлов, for-loop vs with
Я пытаюсь понять компромисс между ними и
способы открытия файлов для линейной обработки
with open('data.txt') as inf:
for line in inf:
#etc
против
for line in open('data.txt'):
# etc
Я понимаю, что использование with
гарантирует, что файл закрыт, когда
"with-block" (suite?) завершен (или исключение встречается). Поэтому я использовал with
с тех пор, как я узнал об этом здесь.
Re for
-loop: от поиска по сети и SO, кажется, что файл
закрывается при выходе из for
-loop, зависит от реализации? А также
Я не мог найти ничего о том, как эта конструкция будет иметь дело с
исключения. Кто-нибудь знает?
Если я ошибаюсь в чем-либо выше, я был бы признателен за исправления,
в противном случае существует причина когда-либо использовать конструкцию for
над
with
? (Предполагая, что у вас есть выбор, т.е. Не ограничены версией Python)
Ответы
Ответ 1
Проблема с этим
for line in open('data.txt'):
# etc
Разве вы не держите явную ссылку на открытый файл, так как вы его закрываете?
Ленивый путь - ждать сбора сборщика мусора, но это может означать, что ресурсы не освобождаются своевременно.
Итак, вы можете сказать
inf = open('data.txt')
for line in inf:
# etc
inf.close()
Теперь, что произойдет, если есть исключение, когда вы находитесь внутри цикла for? Файл не будет закрыт явно.
Добавьте try/finally
inf = open('data.txt')
try:
for line in inf:
# etc
finally:
inf.close()
Это много кода, чтобы сделать что-то довольно простое, поэтому Python добавил with
, чтобы этот код был написан более читабельным способом. Что заставляет нас здесь
with open('data.txt') as inf:
for line in inf:
#etc
Итак, это предпочтительный способ открыть файл. Если ваш Python слишком стар для оператора with, вы должны использовать версию try/finally
для производственного кода
Ответ 2
Оператор with был введен только в Python 2.5 - только если у вас есть требования к обратной совместимости для более ранних версий, вы должны использовать последние.
Бит большей ясности
Заявление с инструкцией было введено (как вам известно), чтобы охватить систему try/except/finally, которая не является потрясающей для понимания, но все в порядке. В Python (Python in C) реализация его закрывает открытые файлы. Спецификация самого языка не говорит... поэтому IPython, JPython и т.д. Могут выбирать, чтобы файлы открывались, открывались память, независимо, а не бесплатные ресурсы до следующего цикла GC (или вообще, но CPython GC отличается от .NET или Java...).
Я думаю, что единственное, что я слышал об этом, заключается в том, что он добавляет еще один уровень отступов.
Итак, чтобы подвести итог: не будет работать < 2.5, вводит ключевое слово "как" и добавляет уровень отступов.
В противном случае вы контролируете обработку исключений как обычно, и, наконец, блок закрывает ресурсы, если что-то ускользает.
Работает для меня!