with:
  with open('file1.txt', 'r') as f1:
    with open('file2.txt', 'w') as f2:
      # Работа с f1 и f2with:
  with open('file1.txt', 'r') as f1, open('file2.txt', 'w') as f2:
    # Работа с f1 и f2Есть несколько способов объединить несколько блоков with для работы с несколькими ресурсами в Python. Каждый из них имеет свои преимущества и недостатки, и выбор зависит от конкретной ситуации и предпочтений.
with:Самый простой и понятный способ – вложить один блок with в другой.  Каждый блок отвечает за управление одним ресурсом.
with open('file1.txt', 'r') as f1:
    with open('file2.txt', 'w') as f2:
      data = f1.read()
      f2.write(data)
  Преимущества:
Недостатки:
with (доступно с Python 2.7+ и 3.0+):Python позволяет использовать один блок with с кортежем ресурсов.  Менеджер контекста вызывается для каждого ресурса в порядке их перечисления.
with open('file1.txt', 'r') as f1, open('file2.txt', 'w') as f2:
    data = f1.read()
    f2.write(data)
  Преимущества:
Недостатки:
contextlib (contextlib.ExitStack, доступно с Python 3.3+):contextlib.ExitStack позволяет динамически добавлять ресурсы в стек контекстов и гарантирует их корректное освобождение в любом случае, даже если произойдет исключение.
from contextlib import ExitStack
  with ExitStack() as stack:
    f1 = stack.enter_context(open('file1.txt', 'r'))
    f2 = stack.enter_context(open('file2.txt', 'w'))
    data = f1.read()
    f2.write(data)
  Преимущества:
Недостатки:
Выбор подхода зависит от конкретной задачи и личных предпочтений. Для небольшого количества ресурсов и простой логики наилучшим вариантом является использование кортежей в одном блоке with. Для более сложных случаев или когда требуется динамическое управление ресурсами, стоит рассмотреть contextlib.ExitStack.  Вложенные блоки with могут быть полезны, когда есть явная зависимость между ресурсами, но их следует избегать при большом количестве ресурсов.