Python 2.5.2- 'with'语句的替代方案是什么?

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 (most recent call last): File "Main.py", line 7, in from Extractor import Extractor File "/data/client/scripts/Extractor.py", line 29 with open(self._logFile, 'w') as out: ^ SyntaxError: invalid syntax

谢谢, Ron。

3个回答

20

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

from __future__ import with_statement

1
哇,我知道Python很强大,但那种能力真是令人印象深刻! - Mike Christensen
3
我想请使用 from __future__ import flying_cars - retracile
13
@retracile。不必要 - 只需import antigravity :-) (翻译:@retracile。这不是必要的-只需要导入antigravity就可以了 :-)) - ekhumoro
1
from __future__ import with_statement 必须是你的 Python 文件的第一行(可以放在 bang 行之后)。 - syam
1
@syam:它也可以在模块docstring、注释、空行和其他未来导入之前。 - Sven Marnach
1
我想要 from _future_ import hot_chicks,拜托了...!! - diffracteD

3

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

gzipHandler = gzip.open(gzipFile)
out = open(txtFile, 'w')
try:
    for line in gzipHandler:
        out.write(line)
finally:
    out.close()
    gzipHandler.close()
< p > 在 < code > finally 子句中的清理代码将始终被执行,无论是否引发异常。 < /p >

最后一行应该是 out.close() - Kirk Strauser
@KirkStrauser。谢谢。希望现在已经修好了。 - ekhumoro

-1

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

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

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

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

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

请查看上面的"上下文管理器"链接以获取解释。那么它是如何工作的呢?它打开文件,执行您的代码块,然后明确关闭文件。我描述的"旧"版本是如何工作的呢?它打开文件,执行您的代码块,然后在其范围结束或Python进程终止时隐式关闭文件。

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


1
这段代码与上下文管理器的作用完全不同。这段代码只是在整个操作期间吞噬所有发生的异常,而没有提供任何诊断信息(附注:在生产代码中永远不要使用裸的“except”子句!)。上下文管理器确保即使出现异常也会执行清理代码,但会让异常传播。这可以通过try/finally语句来模拟。 - Sven Marnach
这与一般情况下上下文管理器的作用完全不同。但是你能举个例子说明在这种特定情况下它与此上下文管理器实际上有何不同吗?行为上会有什么区别? - Kirk Strauser
在这种情况下,差异与一般情况相同。你的代码没有确保清理代码被执行(即,你的代码没有确保文件被关闭)。 - Sven Marnach
@SvenMarnach 我扩展了我的答案以澄清它。此外,您在第一条评论中提到的 except 部分是 OP 的,不是我的。我同意裸露的 except 是一个糟糕的主意,我(几乎)从不使用它们,但出于演示目的,我不想太多地更改他的代码。 - Kirk Strauser
好的,现在更清楚了。我已经撤回了我的踩,尽管一些细节仍然是错误的。一个错误细节的例子是:“out将在函数停止执行时关闭,因为某种原因。”如果函数由于异常而执行,则异常将包含带有指向该帧的链接的回溯,从而防止文件对象被垃圾回收。此外,在除CPython之外的Python实现中,您甚至不能确定文件在函数返回时是否被垃圾回收。 - Sven Marnach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接