4

ファイル名のリストfilenames = [...]が指定されています。ファイルの名前の可変数のリストとリストの理解をどのように使用するのですか?

I/O安全性のために次のリストの理解度を書き直す可能性はありますか:[do_smth(open(filename, 'rb').read()) for filename in filenames]withステートメント、.closeメソッドなどを使用してください。

もう1つの問題の策定:次のコードに対してI/Oセーフリストの理解度を書くことは可能でしょうか?

results = [] 
for filename in filenames: 
    with open(filename, 'rb') as file: 
     results.append(do_smth(file.read())) 
+1

コードは完全にクリアです。あなたができるだけリストの理解にすべてを入れようとしないでください。 –

答えて

9

あなたが関数にwith声明/ブロックを入れて、リスト内包のそれを呼び出すことができます。

def slurp_file(filename): 
    with open(filename, 'rb') as f: 
     return f.read() 

results = [do_smth(slurp_file(f)) for f in filenames] 
3

あなたは、この目的のためにはPython 3.3で導入されExitStackを使用することができます。

with ExitStack() as stack: 
    files = [stack.enter_context(open(name, "rb")) for name in filenames] 
    results = [do_smth(file.read()) for file in files] 

これは一度にすべてのファイルを開きますが、このユースケースでは必要ではないことに注意してください。ファイル数が多い場合はお勧めできません。

関連する問題