2017-12-05 40 views
0

"with"を使用してファイルを開くソリューションを探しています。任意のアイデアをPython: "with"を使用してzipファイルまたはunzippedファイルを開く

if f.endswith(".gz"): 
    with gzip.open() as f: 
else: 
    with open() as f: 
for line in f: 

:Hoeverは、私は、ファイルがgzip圧縮されたかのどちらかであるかどうかをチェックして、いずれかのようなgzip.openまたはちょうど開いたものを使用したいと思いますか?

+1

'' 'for'''文を関数に移動し、' 'f'''をパラメータとして渡します。 – eandersson

答えて

2

別のコンテキストマネージャを作成する代わりに、単にあなたのwithステートメント内の関数を選択することができます。

with (gzip.open if filename.endswith(".gz") else open)(filename) as f: 
    for line in f: 
     ... 

.gzで終わることは必ずしもファイルgzipファイルを作成していないことを認識しているものの)。

+0

ありがとう、それは私が探していたものです。 – Lowry

1

あなたがこれを行う方法の1つは、それを行う独自のコンテキストマネージャを作成することです。

from contextlib import contextmanager 
def open_file(filename): 
    if filename.endswith(".gz"): 
     with gzip.open(filename) as f: 
      yield f 
    else: 
     with open(filename) as f: 
      yield f 

次に、代わりにこれを使用してファイルを開くことができます。

with open_file("filename") as f: 
    # f will be either the result of `gzip.open` or `open`, depending on its filename. 
    for line in f: 
     pass 

これはあなたを呼び出すように機能するかを選択する柔軟性を与えながら、with句を使用することの利点を維持することができます。

+0

それは素晴らしいですね。わかりやすくするために、私はドンポポタムスの解決策を取りに行きますが、私はこれもたくさん好きです。 – Lowry

+0

十分に良い。両方のソリューションに長所と短所があります。コールのインスタンスが1つだけの場合はおそらく彼をお勧めします。コードベースで2回以上使用されている場合は私のことをお勧めします。鉱山はさらに拡張可能です。いずれにせよ、あなたが選んだ答えを受け入れることを忘れないでください:) – Shadow

+0

完了:ありがとうございました – Lowry

関連する問題