Python2.5.2-什么代替了';与';陈述

Python2.5.2-什么代替了';与';陈述,python,gzip,with-statement,Python,Gzip,With Statement,我为Python2.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”将成为Pytho

我为Python2.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行,在 从提取器导入提取器文件“/data/client/scripts/Extractor.py”,第29行 打开(self._日志文件,'w')作为输出: ^SyntaxError:无效语法

谢谢,
Ron.

在Python2.5中,您实际上可以将
语句一起使用--只需从
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
导入:

from __future__ import with_statement
try/except块中代码的“旧”版本为:

out = open(txtFile, 'w')
for line in gzipHandler:
    out.write(line)
out.close()
带有open()的
实际上在这里也是一样的。Python在垃圾收集其对象时自动关闭文件(有关详细信息,请参阅),因此当它所在的函数由于某种原因停止执行时,
out
将被关闭。此外,如果Python进程在执行
out.close()
之前由于某种原因发生灾难性失败,则当Python进程终止时,操作系统将关闭该文件

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

out = open(txtFile, 'w')
try:
    for line in gzipHandler:
        out.write(line)
finally:
    out.close()
有关说明,请参阅上面指向“上下文管理器”的链接。那么它是如何工作的呢?它打开文件,执行代码块,然后显式关闭文件。我所描述的“旧”版本是如何工作的?它打开文件,执行代码块,然后在其作用域完成或Python进程终止时隐式关闭文件


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

如果不能或不想将
一起使用,则最后使用

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

无论是否引发异常,
finally
子句中的清理代码都将被删除。

Woah我知道Python功能强大,但这一功能令人印象深刻!我想从“未来”进口飞行车,请重新确认。不需要-只需
导入反重力
:-)
from\uuuuuuuuuuuuuu语句导入必须是python文件的第一行(它可以放在bang行之后)。@syam:它前面还可以有模块docstring、注释、空行和其他未来导入。此代码与上下文管理器所做的完全不同。这段代码只接受整个操作过程中发生的所有异常,而不提供任何诊断(旁注:您永远不希望在生产代码中有一个裸露的
except
子句!)。上下文管理器确保即使发生异常也执行清理代码,但允许异常传播。这可以用try/finally语句来模拟,它与上下文管理器通常所做的完全不同。但是你能举一个例子说明它与这个上下文管理器在这个特殊情况下所做的有什么实质性的不同吗?行为上的区别是什么?在这种情况下,区别与一般情况相同。您的代码不能确保执行清理代码(即,您的代码不能确保文件将被关闭)。@SvenMarnach我扩展了我的答案以澄清它。另外,你在第一次评论中提到的
部分是OP的,而不是我的。我同意除了
之外的一个简单的
是个坏主意,我(几乎)从未使用过它们,但为了演示的目的,我不想太多地修改他的代码。好了,现在清楚多了。我收回了我的反对票,尽管有些细节仍然是错误的。错误详细信息的一个示例是“
out
将在其所在的函数因某种原因停止执行时关闭”。如果该函数因异常而执行,则异常将包含带有帧链接的回溯,从而防止对文件对象进行垃圾收集。此外,在除CPython之外的Python实现中,您甚至不能确保在函数返回时文件被垃圾收集。最后一行应该是
out.close()
@KirkStrauser。谢谢希望现在能修好。