927 Stimmen

Wie kann ich mit "with open" in Python mehrere Dateien öffnen?

Ich möchte mehrere Dateien auf einmal ändern, wenn Ich kann sie alle anschreiben. Ich frage mich, ob ich die mehrfachen offenen Aufrufe irgendwie mit dem with Erklärung:

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

Wenn das nicht möglich ist, wie sähe dann eine elegante Lösung für dieses Problem aus?

29voto

FatihAkici Punkte 4131

Verschachtelte "with"-Anweisungen erfüllen die gleiche Aufgabe und sind meiner Meinung nach einfacher zu handhaben.

Nehmen wir an, Sie haben inFile.txt und wollen es gleichzeitig in zwei outFile's schreiben.

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:

Ich verstehe den Grund für die Herabstufung nicht. Ich habe meinen Code vor der Veröffentlichung meiner Antwort getestet, und er funktioniert wie gewünscht: Er schreibt in alle outFile's, genau wie die Frage es verlangt. Kein doppeltes Schreiben oder fehlgeschlagenes Schreiben. Ich bin also wirklich neugierig, warum meine Antwort als falsch, suboptimal oder ähnliches angesehen wird.

6voto

Aashutosh jha Punkte 486

Mit Python 2.6 wird es nicht funktionieren, müssen wir unten Weg zum Öffnen mehrerer Dateien zu verwenden:

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

4voto

Pedro Lobito Punkte 84666

Späte Antwort (8 Jahre), aber für jemanden, der mehrere Dateien zu einer einzigen zusammenfügen kann die folgende Funktion hilfreich sein:

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
...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X