Как открыть несколько файлов с помощью "с открытым" в Python?

Я хочу изменить пару файлов за один раз, iff, я могу написать для всех из них. Мне интересно, могу ли я каким-то образом объединить несколько открытых вызовов с оператором with:

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

Если это невозможно, будет ли это элегантное решение этой проблемы?

Ответ 1

По состоянию на Python 2.7 (или 3.1 соответственно) вы можете написать

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

В более ранних версиях Python вы иногда можете использовать contextlib.nested() для размещения контекстных менеджеров. Это не будет работать, как ожидалось, для открытия многократных файлов, однако - подробности см. В связанной документации.

Ответ 2

Просто замените and на ,, и все будет готово:

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

Ответ 3

Для открытия многих файлов одновременно или для длинных путей файлов может оказаться полезным разбить вещи на несколько строк. Из Руководство по стилю Python, как было предложено @Sven Marnach в комментариях к другому ответу:

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())