Chcę zmienić kilka plików w jednym czasie, wtedy i tylko wtedy mogę pisać do nich wszystkich. Zastanawiam się, czy w jakiś sposób mogę połączyć wiele otwartych wywołań ze 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?
with
otwarcie zmiennej listy plików?ExitStack
od wersji Python 3.3. Nie ma łatwego sposobu na zrobienie tego w żadnej wcześniejszej wersji Pythona.Wystarczy wymienić
and
z,
i gotowe:źródło
Przy otwieraniu wielu plików jednocześnie lub w przypadku długich ścieżek plików przydatne może być podzielenie wielu wierszy. Z Przewodnika po stylu Python sugerowanego przez @Sven Marnach w komentarzach do innej odpowiedzi:
źródło
Zagnieżdżone w oświadczeniach wykonają tę samą pracę i moim zdaniem łatwiej sobie z nimi poradzić.
Załóżmy, że masz plik inFile.txt i chcesz zapisać go jednocześnie w dwóch plikach outFile.
EDYTOWAĆ:
Nie rozumiem przyczyny przegłosowania. Przetestowałem mój kod przed opublikowaniem mojej odpowiedzi i działa on zgodnie z oczekiwaniami: Zapisuje się do wszystkich plików outFile, zgodnie z pytaniem. Brak duplikatów lub brak zapisu. Jestem więc naprawdę ciekawy, dlaczego moja odpowiedź jest uważana za błędną, nieoptymalną lub coś w tym rodzaju.
źródło
Od wersji Python 3.3 możesz używać klasy
ExitStack
zcontextlib
modułu do bezpiecznegootwierania dowolnej liczby plików .
Może zarządzać dynamiczną liczbą obiektów kontekstowych, co oznacza, że okaże się szczególnie przydatny, jeśli nie wiesz, ile plików zamierzasz obsłużyć .
W rzeczywistości kanoniczny przypadek użycia wspomniany w dokumentacji zarządza dynamiczną liczbą plików.
Jeśli jesteś zainteresowany szczegółami, oto ogólny przykład wyjaśniający, jak
ExitStack
działa:Wynik:
źródło
Z Pythonem 2.6 To nie zadziała, musimy użyć poniższego sposobu, aby otworzyć wiele plików:
źródło
Późna odpowiedź (8 lat), ale dla kogoś, kto chce połączyć wiele plików w jeden , pomocna może być następująca funkcja:
źródło