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'はPy​​thon 2.6 Tracebackで予約されたキーワードになります   (最近の最後の呼び出し):ファイル "Main.py"、7行目       エクストラクターインポートエクストラクターファイル "/data/client/scripts/Extractor.py"、29行目       開いている(self._logFile、 'w')as out:               ^ SyntaxError:構文が無効です。

ありがとう、 ロン

6

3 答え

Python 2.5では、 with 文を実際に使用できます。 __ future __

from __future__ import with_statement
19
追加された
うわー、私はPythonが強力だと知っていましたが、その能力は印象的です!
追加された 著者 Mike Christensen,
@retracile。不要 - 単に反重力をインポート :-)
追加された 著者 ekhumoro,
@syam:モジュールのドキュメント文字列、コメント、空白行、その他の将来のインポートも前に置くことができます。
追加された 著者 Sven Marnach,
私は __future__ import flying_cars からをお願いします。
追加された 著者 retracile,
from __future__ import with_statement は、Pythonファイルの最初の行でなければなりません(bang行の後に置くことができます)。
追加された 著者 syam,
私は from _future_ import hot_chicks してほしい... !!
追加された 著者 diffracteD,

を使用できない場合、またはを使用しない場合は、 finally を使用します。

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

finally 句のクリーンアップコードは、例外が発生したかどうかにかかわらず、常に実行されます。

3
追加された
@KirkStrauser。ありがとう。うまくいきました。
追加された 著者 ekhumoro,
最後の行は out.close()である必要があります。
追加された 著者 Kirk Strauser,

try/exceptブロック内のコードの "古い"バージョンは次のようになります:

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

open()... コンテキストマネージャ a>は事実上同じことです。 Pythonはオブジェクトがガベージコレクトされると自動的にファイルを閉じます(質問575278 を参照してください)、 out は何らかの理由で実行中の関数が停止すると閉じられます。さらに、OSは、 out.close()が実行される前に何らかの理由で致命的に失敗した場合、Pythonプロセスが終了するとファイルを閉じます。

with open()コンテキストマネージャは、次のように展開されます。

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

説明については、上記の「コンテキストマネージャ」のリンクを参照してください。それでどうやって動くの?ファイルを開き、コードブロックを実行して、明示的にファイルを閉じます。私が「古い」バージョンの作品はどのように記述されていますか?ファイルを開き、コードブロックを実行し、スコープが終了したとき、またはPythonプロセスが終了したときに暗黙的にファイルを閉じます。

保存しますが、 "明示的な"対 "暗黙的な"部分の機能は同じです。

1
追加された
このコードは、コンテキストマネージャのコードとはまったく異なります。このコードは、すべての動作中に発生するすべての例外を単純に食い止めます(副作用:本番コードでは except コンテキストマネージャは、例外が発生してもクリーンアップコードが実行されることを保証しますが、例外が伝播されるようにします。これは、try/finallyステートメントによってシミュレートすることができます。
追加された 著者 Sven Marnach,
この場合の違いは、一般的な場合と同じです。コードでクリーンアップコードが実行されているとは限りません(コードでファイルが確実にクローズされることはありません)。
追加された 著者 Sven Marnach,
OK、それははるかに明確です。私はdownvoteを取り戻しましたが、詳細のいくつかはまだ間違っています。間違った詳細の1つの例は、 " out は何らかの理由で実行中の関数が停止すると閉じられます。例外のために関数が実行された場合、例外にはフレームへのリンクを含むトレースバックが含まれ、ファイルオブジェクトのガベージコレクションを防止します。さらに、CPython以外のPythonの実装では、関数が返ってきたときにファイルがガベージコレクションされていることを確認することさえできません。
追加された 著者 Sven Marnach,
コンテキストマネージャが一般的に行う とはまったく異なります。しかし、この特定のケースでコンテキストマネージャがこれとは実質的にどのように違うのかの例を挙げることはできますか?行動の違いは何でしょうか?
追加された 著者 Kirk Strauser,
@SvenMarnach私はそれを明確にするために私の答えを拡大した。また、最初のコメントで言及した except の部分はOPであり、私のものではありませんでした。私は裸の except は悪い考えであり、私は(ほとんど)それらを使用しないことに同意しますが、デモンストレーションの目的ではコードをあまり変更したくありませんでした。
追加された 著者 Kirk Strauser,