Python 2.5.2- 'with'语句替代什么?

6 投票
3 回答
13536 浏览
提问于 2025-04-17 05:07

我写的代码是针对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中成为保留关键字 追踪信息 (最近的调用最后): 文件 "Main.py",第7行,在 from Extractor import Extractor 文件 "/data/client/scripts/Extractor.py",第29行 with open(self._logFile, 'w') as out: ^ 语法错误:无效的语法

谢谢,
Ron。

3 个回答

-1

你在try/except块里的“旧”版本代码是:

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

这里的with open() ... 上下文管理器其实和之前的代码差不多。Python会在文件对象被垃圾回收时自动关闭文件(想了解更多可以看这个问题),所以当包含out的函数停止执行时,out就会被关闭。此外,如果Python进程因为某种原因意外终止,操作系统也会关闭文件,这样就算out.close()还没执行,文件也会被关闭。

with open()的上下文管理器大致展开成:

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

想了解“上下文管理器”的具体解释,可以参考上面的链接。那么它是怎么工作的呢?它打开文件,执行你的代码块,然后明确地关闭文件。那我提到的“旧”版本是怎么工作的呢?它打开文件,执行你的代码块,然后在作用域结束时或者Python进程终止时隐式地关闭文件。

除了“显式”和“隐式”这部分,功能是完全一样的。

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 这个部分的清理代码总是会被执行,不管有没有发生错误。

20

在Python 2.5中,你其实是可以使用with语句的——只需要从__future__导入它就可以了:

from __future__ import with_statement

撰写回答