854 votes

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

Je veux modifier quelques fichiers en une seule fois, si Je peux leur écrire à tous. Je me demande si je ne peux pas combiner les appels ouverts multiples avec le système de gestion de l'information. 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 ?

2 votes

Une autre question similaire : Plusieurs variables dans une instruction "with" ?

25voto

FatihAkici Points 1420

Les instructions imbriquées avec font le même travail et, à mon avis, sont plus simples à utiliser.

Disons que vous avez un fichier inFile.txt et que vous voulez l'écrire simultanément dans deux fichiers outFile.

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)

EDIT :

Je ne comprends pas la raison du downvote. J'ai testé mon code avant de publier ma réponse, et il fonctionne comme souhaité : Il écrit dans tous les outFile's, comme le demande la question. Pas d'écriture en double ou d'échec d'écriture. Je suis donc vraiment curieux de savoir pourquoi ma réponse est considérée comme mauvaise, sous-optimale ou autre.

1 votes

Je ne sais pas ce que quelqu'un d'autre a rétrogradé, mais je vous ai UPVOTED parce que c'est le seul exemple qui avait trois fichiers (un d'entrée, deux de sortie), ce qui s'est avéré être exactement ce dont j'avais besoin.

2 votes

Peut-être que vous êtes rétrogradé parce que dans Python > 2.6, vous pouvez écrire du code plus pythonique gist.github.com/IaroslavR/3d8692e2a11e1ef902d2d8277eb88cb8 (pourquoi je ne peux pas insérer de fragment de code dans les commentaires ? !) Nous sommes en 2018 ;) donc les anciennes versions appartiennent au passé.

2 votes

Un rappel amical à ceux qui font fi de python 2.6 : CentOS 6 (qui n'est pas EOL avant novembre 2020), utilise toujours py2.6 par défaut. Cette réponse reste donc (à l'heure actuelle) la meilleure dans l'ensemble, selon moi.

5voto

Aashutosh jha Points 188

Avec python 2.6, cela ne fonctionnera 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:

2voto

Pedro Lobito Points 6794

Réponse tardive (8 ans), mais pour quelqu'un qui cherche à joindre plusieurs fichiers en un seul la fonction suivante peut vous être utile :

def multi_open(_list):
    out=""
    for x in _list:
        try:
            with open(x) as f:
                out+=f.read()
        except:
            pass
            # print(f"Cannot open file {x}")
    return(out)

fl = ["C:/bdlog.txt", "C:/Jts/tws.vmoptions", "C:/not.exist"]
print(multi_open(fl))

2018-10-23 19:18:11.361 PROFILE  [Stop Drivers] [1ms]
2018-10-23 19:18:11.361 PROFILE  [Parental uninit] [0ms]
...
# This file contains VM parameters for Trader Workstation.
# Each parameter should be defined in a separate line and the
...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X