Python 2.5.2 - что было вместо «с» - PullRequest
6 голосов
/ 27 октября 2011

Я написал свой код для 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

Прямо сейчас, когда я пытаюсь запустить свой скрипт, я получаю эту ошибку:

Предупреждение: «с» станет зарезервированным ключевым словом в Python 2.6 Traceback (последний вызов был последним): файл «Main.py», строка 7, из файла Extractor для импорта, экстрактор «/data/client/scripts/Extractor.py»строка 29 с открытым (self._logFile, 'w') как out: ^ SyntaxError: неверный синтаксис

Спасибо, Рон.

Ответы [ 3 ]

19 голосов
/ 27 октября 2011

В Python 2.5 вы на самом деле можете использовать оператор with - просто импортируйте его из __future__:

from __future__ import with_statement
3 голосов
/ 27 октября 2011

Если вы не можете или не хотите использовать with, используйте finally:

gzipHandler = gzip.open(gzipFile)
out = open(txtFile, 'w')
try:
    for line in gzipHandler:
        out.write(line)
finally:
    out.close()
    gzipHandler.close()

Код очистки в предложении finally всегда будет выполнен,Возникло исключение или нет.

0 голосов
/ 27 октября 2011

«Старая» версия кода внутри вашего блока try / Кроме того, будет:

out = open(txtFile, 'w')
for line in gzipHandler:
    out.write(line)
out.close()

Диспетчер контекста with open() ... - фактически то же самое. Python автоматически закрывает файлы, когда их объекты собираются сборщиком мусора (подробности см. question 575278 ), поэтому out будет закрыто, когда функция, по которой он работает, по какой-то причине прекращает выполнение. Кроме того, ОС закроет файл, когда процесс Python завершится, если он по какой-либо причине завершится сбоем, прежде чем будет выполнено out.close().

Диспетчер контекста with open() расширится примерно до:

out = open(txtFile, 'w')
try:
    for line in gzipHandler:
        out.write(line)
finally:
    out.close()

См. Приведенную выше ссылку на "менеджер контекста" для объяснения. Итак, как это работает? Он открывает файл, выполняет ваш блок кода, а затем явно закрывает файл. Как работает «старая» версия, которую я описываю? Он открывает файл, выполняет ваш блок кода, а затем неявно закрывает файл, когда завершается его область действия или когда завершается процесс Python.

Сохранение, но для "явных" и "неявных" частей, функциональность идентична.

...