6

Python 2.7用のコードを作成しましたが、サーバーには2.5があります。次のコードをPython2.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行目、ExtractorからのインポートExtractorファイル「/data/client/scripts/Extractor.py」、 open(self._logFile、'w')をoutとして持つ29行目:^ SyntaxError:無効な構文

ありがとう、ロン。

4

3 に答える 3

20

Python 2.5では、実際にステートメントを使用できwithます。次の場所からインポートするだけ__future__です。

from __future__ import with_statement
于 2011-10-27T15:58:04.687 に答える
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例外が発生したかどうかに関係なく、句内のクリーンアップコードは常に実行されます。

于 2011-10-27T16:48:07.917 に答える
-1

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

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

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

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

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

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

保存しますが、「明示的」部分と「暗黙的」部分の機能は同じです。

于 2011-10-27T16:12:26.253 に答える