How to open multiple files using “with open” in Python?

Python has various highly useful methods for working with file-like objects, like the with feature. But what if we need to open several files in this manner? You wouldn’t exactly be “clean” if you had a number of nested open statements. In this article, we will demonstrate how to open multiple files in Python using the with open statement.

What is “with open” in Python?

“the ” is a Python construct for opening and managing files. It ensures that resources (such as files) are appropriately maintained and closed when no longer required, even if there is an error during processing. When dealing with file I/O operations, this construct is typically referred to as the “context manager”.

To open multiple files using “with open” in Python, you can use multiple with statements or combine them into a single with the statement using the contextlib.ExitStack context manager. Here’s how we can do it:

1. Open Multiple files Using Multiple with Statements

we can use multiple with statements, each opening a different file:

Python
# code
with open('file1.txt', 'r') as file1, open('file2.txt', 'r') as file2:
    content1 = file1.read()
    content2 = file2.read()
# Files are automatically closed after exiting the `with` block

Assuming file1.txt contains “Hello” and file2.txt contains “Monu”, the output of content1 and content2 would be as follows:

Output:

content1 = "Hello"
content2 = "Monu"

So, the output depends on the content of the files file1.txt and file2.txt. If you provide the content of these files, I can give you the exact output after running the code.

2. Open Multiple files Using contextlib.ExitStack

If you have a dynamic number of files to open or want to open files stored in a list or other iterable, you can use contextlib.ExitStack:

Python
# code
from contextlib import ExitStack

file_paths = ['file1.txt', 'file2.txt', 'file3.txt']

with ExitStack() as stack:
    files = [stack.enter_context(open(file_path, 'r')) for file_path in file_paths]
    contents = [file.read() for file in files]
    

Output

# Files are automatically closed after exiting the `with` block

Let’s assume the following content for each file:

file1.txt contains: “Hello”

file2.txt contains: “w3wiki”

file3.txt contains: “Python”

Output:

contents = ['Hello', 'w3wiki', 'Python']

Conclusion:

Each element in the contents list corresponds to the content of each file in the file_paths list, respectively. So, contents[0] will contain the content of file1.txt, contents[1] will contain the content of file2.txt, and contents[2] will contain the content of file3.txt.