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

Линейная обработка файлов, 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)

4b9b3361

Ответ 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, вводит ключевое слово "как" и добавляет уровень отступов.

В противном случае вы контролируете обработку исключений как обычно, и, наконец, блок закрывает ресурсы, если что-то ускользает.

Работает для меня!