2016-04-15 2 views
1

J'ai ce bit de code à usage unique, extrait d'une fonction pour supprimer des dizaines de milliers de répertoires et leur contenu. Il est très bien, mais je me demande si je peux utiliser « avec open() comme » un tas de fichiers sans indenter et indenter et ... indenterComment puis-je ouvrir un tas de fichiers (avec gestion de contexte) sans imbriquer un tas de retraits

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 

Cette question ne touche sur le même sujet comme python: create a "with" block on several context managers. Les deux devraient être liés, mais deux choses importantes rendent cette question distincte. 1) Cette question utilise l'exemple canonique de l'utilisation du gestionnaire de contexte: "avec open (f) comme fd:" par opposition à la mention d'objets "lock" obtenus d'un gestionnaire de contexte, (évidemment le même mais pas si évidemment) et est plus important 2) Une recherche diligente n'a pas réussi à faire apparaître la question précédente ou ses réponses. (Peut-être cela a-t-il été rendu plus difficile par l'omniprésence absolue de 'avec', 'as', 'contexte' et 'manager' comme termes de recherche médiocres et que le mot-clé "gestionnaire de contexte" est introuvable.)

+0

Peut-être une question pour Stack Exchange Code Review? – palsch

+2

Copie possible de [python: créer un bloc "avec" sur plusieurs gestionnaires de contexte] (http://stackoverflow.com/questions/3024925/python-create-a-with-block-on-several-context-managers) –

+0

Merci d'avoir signalé la question connexe. Bonne connexion. Je n'ai pas trouvé ma recherche. – mohawkTrail

Répondre

3

simple. Exemple d'ouverture de trois fichiers pour l'écriture:

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

Oui, très bien, mais at-il la grâce radicale de l'original plus architectural. – mohawkTrail