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