2016-04-15 9 views
1

何千ものディレクトリとその内容を削除する関数から抽出した、この1回限りのコードを持っています。複数のインデントを入れ子にすることなく、(コンテキスト管理を使って)たくさんのファイルを開く方法

with open(deleted_dirs, 'w') as out_removed: 
    with open(unsuccessful_targets, 'w') as out_fail: 
     with open(already_gone, 'w') as out_nowhere: 
      for target in targets: 
       try: 
        shutil.rmtree(target, ignore_errors=False, onerror=on_fail_rmtree) 
        print(target, file=out_removed) 
       except FileNotFoundError: 
        print(target, file=out_nowhere) 
       except PermissionError: 
        logger.warning('Permission Error: {}'.format(target)) 
        print(target, file=out_fail) 
return 

この質問は同じでタッチをする...それは素晴らしいですが、私はインデントやインデントやインデントせずにファイルの束に「など)(オープンして、」使用できる場合、私は思ったんだけどトピックはpython: create a "with" block on several context managersです。 2つはリンクされるべきですが、2つの重要なことがこの問題を明確にします。 1)この質問は、コンテクストマネージャーの使用の標準的な例を使用しています: "open(f)as fd:"対コンテキストマネージャーから得られる "ロック"オブジェクトの言及(明らかに同じですが、 2)勤勉な検索で、以前の質問やその答えが出されなかった。 (恐らく、これは 'with'、 'as'、 'context'、 'manager'という貧しい検索語句の絶対偏在によってさらに困難になり、キーワード「contextmanager」は推測できないと思われる)。

+0

多分Stack Exchange Code Reviewの質問ですか? – palsch

+2

[python:複数のコンテキストマネージャーで "with"ブロックを作成する](http://stackoverflow.com/questions/3024925/python-create-a-with-block-on-several-context-managers) –

+0

関連する質問を指摘してくれてありがとう。良い接続。私はそれを私の検索では見つけられなかった。 – mohawkTrail

答えて

3

シンプル。書き込みのために3つのファイルを開く例:

with open('file1', 'w') as f1, open('file2', 'w') as f2, open('file3', 'w') as f3: 
    # do stuff 
+0

はい、とても素敵ですが、より建築的なオリジナルの優雅な猶予があります。 – mohawkTrail

関連する問題