with open('file1.txt', 'r') as f1, open('file2.txt', 'w') as f2:
data = f1.read()
f2.write(data)
Или, если необходимо, можно использовать модуль `contextlib` и его функцию `contextlib.nested` (до Python 3.6):
import contextlib
with contextlib.nested(open('file1.txt', 'r'), open('file2.txt', 'w')) as (f1, f2):
data = f1.read()
f2.write(data)
Начиная с Python 3.7, использование вложенных `with` - предпочтительный способ. `contextlib.nested` объявлен устаревшим.
Для работы с несколькими файлами одновременно в 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
обеспечивает более гибкое и управляемое решение.