Python 2.5.2-而不是'with'语句

时间:2011-10-27 15:56:03

标签: python gzip with-statement

我为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行,in       来自Extractor import Extractor File“/data/client/scripts/Extractor.py”,第29行       打开(self._logFile,'w')为:               ^ SyntaxError:语法无效

谢谢, 罗恩。

3 个答案:

答案 0 :(得分:19)

在Python 2.5中,您实际上可以使用with语句 - 只需从__future__导入它:

from __future__ import with_statement

答案 1 :(得分:3)

如果您不能或不想使用with,请使用finally

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

无论是否引发异常,finally子句中的清理代码将始终有效。

答案 2 :(得分:-1)

try / except块中的代码的“旧”版本将是:

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

with open() ... context manager实际上与此相同。当对象被垃圾收集时,Python会自动关闭文件(有关详细信息,请参阅question 575278),因此当{1}}函数由于某种原因停止执行时,它将被关闭。此外,操作系统将在Python进程终止时关闭文件,如果在执行out之前由于某种原因导致灾难性失败。

out.close()上下文管理器将扩展为大约:

with open()

有关说明,请参阅上面的“上下文管理器”链接。那么它是怎样工作的?它打开文件,执行您的代码块,然后显式关闭文件。我描述的“旧”版本如何工作?它打开文件,执行你的代码块,然后在其范围完成或Python进程终止时隐式关闭文件。

保存但对于“显式”与“隐式”部分,功能相同。