Они оба довольно питонны. Чтобы ответить на ваш второй вопрос, во второй функции файл действительно будет автоматически закрыт. Это часть протокола, используемого с оператором with
. По иронии судьбы, файл не гарантированно будет закрыт в первом примере (подробнее о том, почему через секунду).
В конечном счете, я бы выбрал оператор with
, и вот почему - в соответствии с PEP 343 :
with EXPR as VAR:
BLOCK
Переводится на:
mgr = (EXPR)
exit = type(mgr).__exit__ # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
try:
VAR = value # Only if "as VAR" is present
BLOCK
except:
# The exceptional case is handled here
exc = False
if not exit(mgr, *sys.exc_info()):
raise
# The exception is swallowed if exit() returns true
finally:
# The normal and non-local-goto cases are handled here
if exc:
exit(mgr, None, None, None)
Как видите, в этом случае вы получаете большую защиту - ваш файл гарантированно будет закрыт независимо от того, что происходит в промежуточном коде. Это также действительно помогает для удобочитаемости; представьте, если бы вам приходилось помещать этот огромный блок кода каждый раз, когда вы хотите открыть файл!