Как я могу открыть несколько файлов, используя "открытые" в 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()чтобы вложить контекстные менеджеры. Это не будет работать, как ожидалось для открытия нескольких файлов, хотя -- см. связанную документацию для получения дополнительной информации.
просто заменить
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)EDIT:
Я не понимаю причину понижения. Я протестировал свой код перед публикацией моего ответа, и он работает по желанию: он пишет во все outFile, так же, как и вопрос. Нет дубликатов записи или не писать. Так я и есть действительно любопытно узнать, почему мой ответ считается неправильным, неоптимальным или что-то в этом роде.
С python 2.6 это не будет работать, мы должны использовать ниже способ открыть несколько файлов:
with open('a', 'w') as a: with open('b', 'w') as b:
Comments