Я хочу изменить пару файлов одновременно, если я смогу записать их все. Мне интересно, смогу ли я как-то объединить несколько открытых вызовов с помощью 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
Если это невозможно, как будет выглядеть элегантное решение этой проблемы?
with
чтобы открыть список переменных файлов?ExitStack
как на Python 3.3. Нет простого способа сделать это в любой более ранней версии Python.Просто замените
and
на,
и все готово:источник
Для одновременного открытия большого количества файлов или для длинных путей к файлам может быть полезно разбить элементы на несколько строк. Из Руководства по стилю Python, предложенного @Sven Marnach в комментариях к другому ответу:
источник
Вложенные с заявлениями сделают ту же самую работу, и, на мой взгляд, более просты в обращении.
Допустим, у вас есть inFile.txt, и вы хотите записать его в два outFile одновременно.
РЕДАКТИРОВАТЬ:
Я не понимаю причину понижения. Я проверил свой код перед публикацией своего ответа, и он работает, как нужно: пишет во все outFile, как и спрашивает вопрос. Нет дублирования записи или не писать. Поэтому мне действительно любопытно узнать, почему мой ответ считается неправильным, неоптимальным или чем-то подобным.
источник
Начиная с Python 3.3, вы можете использовать класс
ExitStack
изcontextlib
модуля, чтобы безопаснооткрывать произвольное количество файлов .
Он может управлять динамическим числом контекстно-зависимых объектов, что означает, что он окажется особенно полезным, если вы не знаете, сколько файлов вы собираетесь обрабатывать .
Фактически, канонический вариант использования, упомянутый в документации, управляет динамическим числом файлов.
Если вы заинтересованы в деталях, вот общий пример, чтобы объяснить, как
ExitStack
работает:Вывод:
источник
С Python 2.6 это не будет работать, мы должны использовать следующий способ, чтобы открыть несколько файлов:
источник
Поздний ответ (8 лет), но для тех, кто хочет объединить несколько файлов в один , может помочь следующая функция:
источник