Comment puis-je ouvrir plusieurs fichiers en utilisant “ouvert” en Python?
Je veux modifier quelques fichiers à la fois, iff je peux écrire à chacun d'eux. Je me demande si j'ai quelque peut combiner les multiples appels ouverts avec la with
déclaration:
try:
with open('a', 'w') as a and open('b', 'w') as b:
do_something()
except IOError as e:
print 'Operation failed: %s' % e.strerror
Si ce n'est pas possible, ce qui serait une solution élégante à ce problème ressemble?
Vous devez vous connecter pour publier un commentaire.
De Python 2.7 (ou 3.1, respectivement), vous pouvez écrire
Dans les précédentes versions de Python, vous pouvez parfois utiliser
contextlib.imbriquée()
à nid contexte gestionnaires. Cela ne fonctionne pas comme prévu pour l'ouverture de plusieurs fichiers, mais-voir le liés à la documentation pour plus de détails.Dans les rares cas où vous voulez ouvrir un nombre variable de fichiers en même temps, vous pouvez utiliser
contextlib.ExitStack
, à partir d'une version de Python 3.3:La plupart du temps, vous avez un ensemble de variables de fichiers, vous souhaiterez probablement de les ouvrir les uns après les autres, si.
with
pour ouvrir une variable de la liste de fichiers?ExitStack
avec Python 3.3. Il n'y a pas de moyen facile de le faire dans une version antérieure de Python.for line_a, line_b in zip(a, b)
, oùa
etb
sont les deux objets de fichier comme ci-dessus. (En général, n'hésitez pas à poser une nouvelle question, au lieu de commenter, ou même mieux, de rechercher les questions en premier.)Il suffit de remplacer
and
avec,
et vous avez terminé:Pour l'ouverture de plusieurs fichiers à la fois ou pour des longs chemins d'accès aux fichiers, il peut être utile de diviser les choses en place sur plusieurs lignes. À partir de la Python Guide De Style comme suggéré par @Sven Marnach dans les commentaires à l'autre de répondre:
Imbriquée avec les états vont faire le même travail, et à mon avis, sont plus simples à traiter.
Disons que vous avez inFile.txt, et que vous voulez l'écrire en deux outFile est simultanément.
EDIT:
Je ne comprends pas la raison de la downvote. J'ai testé mon code avant de publier ma réponse, et il fonctionne comme vous le souhaitez: Il écrit à tous outFile est, tout comme la question se pose. Aucun duplicata écrire ou ne pas écrire. Donc, je suis vraiment curieux de savoir pourquoi ma réponse est considérée à tort, sous-optimale ou quelque chose comme ça.
Depuis Python 3.3, vous pouvez utiliser la classe
ExitStack
de lacontextlib
module en toute sécuritéouvrir un nombre arbitraire de fichiers.
Il peut gérer un dynamique numéro de compte du contexte des objets, ce qui signifie qu'il sera particulièrement utile si vous ne savez pas combien de fichiers que vous allez gérer.
En fait, la structure canonique de cas d'utilisation qui est mentionné dans la documentation de la gestion d'un nombre dynamique de fichiers.
Si vous êtes intéressé par les détails, voici un exemple générique dans le but d'expliquer comment
ExitStack
fonctionne:De sortie:
Avec python 2.6, Cela ne fonctionnera pas, nous devons l'utiliser en dessous de façon à ouvrir plusieurs fichiers:
Réponse tardive (8 ans), mais pour quelqu'un qui cherche à joindre plusieurs fichiers en un seul, la fonction suivante peut être de l'aide: