Python 2.5.2- 'with'语句替代什么?
我写的代码是针对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 个回答
你在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进程终止时隐式地关闭文件。
除了“显式”和“隐式”这部分,功能是完全一样的。
如果你不想用 with
,或者不能用它,那就用 finally
:
gzipHandler = gzip.open(gzipFile)
out = open(txtFile, 'w')
try:
for line in gzipHandler:
out.write(line)
finally:
out.close()
gzipHandler.close()
在 finally
这个部分的清理代码总是会被执行,不管有没有发生错误。
在Python 2.5中,你其实是可以使用with
语句的——只需要从__future__
导入它就可以了:
from __future__ import with_statement