Я написал свой код для python 2.7, но у сервера 2,5. Как переписать следующий код, чтобы он выполнялся в python 2.5.2:
gzipHandler = gzip.open(gzipFile)
try:
with open(txtFile, 'w') as out:
for line in gzipHandler:
out.write(line)
except:
pass
Прямо сейчас, когда я пытаюсь запустить мой скрипт, я получаю эту ошибку:
Предупреждение: 'with' станет зарезервированным ключевым словом в Python 2.6 Traceback (последний последний звонок): Файл «Main.py», строка 7, в из Extractor import Extractor File "/data/client/scripts/Extractor.py", строка 29 с open (self._logFile, 'w') как из: ^ СинтаксисError: недопустимый синтаксис
Благодаря, Рон.
В Python 2.5 вы действительно можете использовать оператор with
- просто импортируйте его из __ future __
:
from __future__ import with_statement
Если вы не можете или не хотите использовать с
, используйте finally
:
gzipHandler = gzip.open(gzipFile)
out = open(txtFile, 'w')
try:
for line in gzipHandler:
out.write(line)
finally:
out.close()
gzipHandler.close()
Код очистки в предложении finally
всегда будет исключен, независимо от того, создано ли исключение или нет.
«Старая» версия кода внутри вашего блока try/except будет:
out = open(txtFile, 'w')
for line in gzipHandler:
out.write(line)
out.close()
с open () ...
менеджер контекста здесь фактически то же самое. Python автоматически закрывает файлы, когда их объекты собирают мусор (см. вопрос 575278 для получения более подробной информации), поэтому out
будет закрыт, когда по какой-либо причине функция, с которой он работает, перестает выполняться. Кроме того, ОС закроет файл, когда процесс Python завершится, если он по какой-то причине завершится катастрофически, прежде чем будет выполнен запуск out.close ()
.
Контекстный менеджер с open ()
будет расширяться примерно до:
out = open(txtFile, 'w')
try:
for line in gzipHandler:
out.write(line)
finally:
out.close()
См. Приведенную выше ссылку на «менеджер контекста» для объяснения. Итак, как это работает? Он открывает файл, выполняет блок кода, затем явно закрывает файл. Как работает «старая» версия, которую я описываю? Он открывает файл, выполняет ваш блок кода, затем неявно закрывает файл, когда его область завершена, или когда процесс Python завершается.
Сохранить, но для «явных» и «неявных» частей функциональность идентична.