Question Comment puis-je ouvrir plusieurs fichiers en utilisant "with open" en Python?


Je veux changer quelques fichiers à la fois, sff Je peux écrire à tous. Je me demande si je peux en quelque sorte combiner les appels ouverts multiples avec le 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, à quoi ressemblerait une solution élégante à ce problème?


460
2018-01-06 16:16


origine


Réponses:


À partir de Python 2.7 (ou 3.1 respectivement), vous pouvez écrire

with open('a', 'w') as a, open('b', 'w') as b:
    do_something()

Dans les versions antérieures de Python, vous pouvez parfois utiliser contextlib.nested() imbriquer les gestionnaires de contexte. Cela ne fonctionnera pas comme prévu pour l'ouverture de fichiers multiples, cependant - voir la documentation liée pour plus de détails.


717
2018-01-06 16:19



Remplace juste and avec , et tu as fini:

try:
    with open('a', 'w') as a, open('b', 'w') as b:
        do_something()
except IOError as e:
    print 'Operation failed: %s' % e.strerror

83
2018-01-06 16:20



Pour ouvrir plusieurs fichiers à la fois ou pour des chemins de fichiers longs, il peut être utile de décomposer plusieurs lignes. Du Guide de style Python comme suggéré par @Sven Marnach dans les commentaires à une autre réponse:

with open('/path/to/InFile.ext', 'r') as file_1, \
     open('/path/to/OutFile.ext', 'w') as file_2:
    file_2.write(file_1.read())

35
2017-09-15 23:40



Imbriqués avec des déclarations feront le même travail, et à mon avis, sont plus simples à traiter.

Disons que vous avez inFile.txt et que vous voulez l'écrire dans deux fichiers de sortie simultanément.

with open("inFile.txt", 'r') as fr:
    with open("outFile1.txt", 'w') as fw1:
        with open("outFile2.txt", 'w') as fw2:
            for line in fr.readlines():
                fw1.writelines(line)
                fw2.writelines(line)

MODIFIER:

Je ne comprends pas la raison de l'abaissement. J'ai testé mon code avant de publier ma réponse, et cela fonctionne comme je le souhaite: Il écrit à tout outFile, comme la question le demande. Pas d'écriture en double ou ne pas écrire. Donc, je suis vraiment curieux de savoir pourquoi ma réponse est considérée comme fausse, sous-optimale ou quelque chose comme ça.


6
2017-12-08 22:56



Avec python 2.6 Cela ne marchera pas, nous devons utiliser la méthode ci-dessous pour ouvrir plusieurs fichiers:

with open('a', 'w') as a:
    with open('b', 'w') as b:

1
2018-02-02 05:38