Jak mogę otworzyć wiele plików używając opcji "z open" w Pythonie?

Chcę zmienić kilka plików na raz, iff mogę napisać do wszystkich. Zastanawiam się, czy jakoś mogę połączyć wiele otwartych wywołań z with stwierdzeniem:

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
Jeśli nie jest to możliwe, jak wyglądałoby eleganckie rozwiązanie tego problemu?
Author: Martin Thoma, 2011-01-06

5 answers

Od Pythona 2.7 (lub odpowiednio 3.1) możesz napisać

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

We wcześniejszych wersjach Pythona można czasami użyć contextlib.nested() zagnieżdżanie menedżerów kontekstu. Nie będzie to jednak działać zgodnie z oczekiwaniami przy otwieraniu plików wielokrotności -- szczegóły można znaleźć w połączonej dokumentacji.

 743
Author: Sven Marnach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 23:30:43

Wystarczy zamienić and na , i gotowe:

try:
    with open('a', 'w') as a, open('b', 'w') as b:
        do_something()
except IOError as e:
    print 'Operation failed: %s' % e.strerror
 85
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-06 16:20:42

Do otwierania wielu plików naraz lub długich ścieżek plików, przydatne może być dzielenie rzeczy na wiele linii. Z Python Style Guide {[3] } Jak zasugerował @Sven Marnach w komentarzach do innej odpowiedzi:

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())
 37
Author: Michael Ohlrogge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-25 19:44:03

Zagnieżdżone ze stwierdzeniami wykonają tę samą pracę i moim zdaniem są prostsze w obsłudze.

Powiedzmy, że masz inFile.txt, i chce to zapisac na dwa outFile ' y jednoczesnie.
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:

Nie rozumiem powodu negatywnej opinii. Przetestowałem mój kod przed opublikowaniem odpowiedzi i działa zgodnie z życzeniem: pisze do wszystkich outFile ' ów, tak jak zadaje pytanie. Brak duplikatu zapisu lub brak zapisu. Więc jestem naprawdę ciekaw, dlaczego mój odpowiedź jest uważana za błędną, nieoptymalną lub coś w tym stylu.
 7
Author: FatihAkici,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 22:57:11

W Pythonie 2.6 to nie zadziała, musimy użyć poniższego sposobu, aby otworzyć wiele plików:

with open('a', 'w') as a:
    with open('b', 'w') as b:
 3
Author: Aashutosh jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 05:38:54