6

我为 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 行,从提取器导入提取器文件“/data/client/scripts/Extractor.py”,第 29 行,open(self._logFile, 'w') 为 out: ^ SyntaxError: invalid syntax

谢谢,罗恩。

4

3 回答 3

20

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

from __future__ import with_statement
于 2011-10-27T15:58:04.687 回答
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将始终被执行,无论是否引发异常。

于 2011-10-27T16:48:07.917 回答
-1

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

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

with open() ... 上下文管理器在这里实际上是一样的。当文件的对象被垃圾回收时,Python 会自动关闭文件(有关详细信息,请参阅问题 575278),因此out当它所在的函数由于某种原因停止执行时将关闭。out.close()此外,如果 Python 进程在执行之前由于某种原因发生灾难性失败,操作系统将在 Python 进程终止时关闭文件。

上下文管理器将with open()扩展到大约:

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

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

除了“显式”与“隐式”部分,功能是相同的。

于 2011-10-27T16:12:26.253 回答