with open('file1.txt', 'r') as f1, open('file2.txt', 'w') as f2:
    data = f1.read()
    f2.write(data)
  import contextlib
  with contextlib.nested(open('file1.txt', 'r'), open('file2.txt', 'w')) as (f1, f2):
    data = f1.read()
    f2.write(data)
  Для работы с несколькими файлами одновременно в Python, оператор with можно использовать разными способами. Основная идея заключается в том, чтобы гарантировать закрытие всех файлов, даже если в процессе работы произойдет исключение.
1. Вложенные конструкции with:
Этот способ является наиболее простым и понятным, особенно для небольшого количества файлов.  Просто вкладываем один with блок в другой:
with open('file1.txt', 'r') as f1:
    with open('file2.txt', 'w') as f2:
        for line in f1:
            f2.write(line)
    В этом примере file1.txt открывается для чтения, а file2.txt для записи. После завершения блока with для f2, файл file2.txt автоматически закрывается.  Затем, когда завершается внешний блок with для f1, file1.txt тоже закрывается.
2. Использование контекстных менеджеров (contextlib):
Когда количество файлов становится большим, вложенные конструкции становятся неудобными.  В этом случае можно использовать модуль contextlib, а именно функцию contextlib.ExitStack.
import contextlib
files = ['file1.txt', 'file2.txt', 'file3.txt']
with contextlib.ExitStack() as stack:
    file_objects = [stack.enter_context(open(filename, 'r')) for filename in files]
    # Теперь file_objects содержит список открытых файловых объектов
    for file_object in file_objects:
        # Работаем с файлами
        for line in file_object:
            print(line.strip())
    # Все файлы будут автоматически закрыты при выходе из блока with
    В этом примере:
contextlib.ExitStack() создает объект, который управляет группой контекстных менеджеров.stack.enter_context(open(filename, 'r')) открывает каждый файл и добавляет его в стек.  enter_context() возвращает файловый объект, который мы сохраняем в списке file_objects.with, ExitStack автоматически закрывает все файлы в обратном порядке, в котором они были открыты.Преимущества использования with:
Выбор между вложенными with и contextlib.ExitStack зависит от количества файлов и предпочтений разработчика. Для небольшого количества файлов вложенные with могут быть проще.  Для большого количества файлов ExitStack обеспечивает более гибкое и управляемое решение.