Как открыть несколько файлов с помощью "with open" в 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

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

5 ответов


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

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

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


просто заменить 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

для открытия многих файлов сразу или для длинных путей к файлам может быть полезно разбить вещи на несколько строк. От Руководство По Стилю 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())

вложенные операторы будут выполнять ту же работу и, на мой взгляд, более просты в обращении.

допустим, у вас есть inFile.txt, и хочу записать его в два 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)

изменить:

Я не понимаю причину downvote. Я проверил свой код перед публикацией моего ответа, и он работает по желанию: он пишет всем outFile, так же, как задает вопрос. Не дублировать писать или не писать. Так и есть. очень любопытно узнать, почему мой ответ считается неправильным, неоптимальным или что-то в этом роде.


С Python 2.6 он не будет работать, мы должны использовать ниже способ открыть несколько файлов:

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