The with keyword in Python is used as a context manager. As in any programming language, the usage of resources like file operations or database connections is very common. But these resources are limited in supply. Therefore, the main problem lies in making sure to release these resources after usage. If they are not released, then it will lead to resource leakage and may cause the system to either slow down or crash.
As we know, the open() function is generally used for file handling in Python. But it is a standard practice to use context managers like with keywords to handle files as it will automatically release files once its usage is complete.
Python with open() Syntax:
Syntax:
with open(file_path, mode, encoding) as file:
…
file_path: It is the path to the file to open
mode: mode of operation on the file. ex.: read, write etc. (represented by r, w, r+, w+, rb, wb etc.)
encoding: read the file in correct encoding format.
Example 1: Simple Example Using The with Statement
We already have a file name neveropen.txt in our system, and it has the following data:
Now we will open the file and read the contents of the file using with open() statement:
Python3
with open ( "neveropen.txt" , "r" ) as gfg_file: file_content = gfg_file.read() print (file_content) |
Output:
GeeksForGeeks is best for DSA
Note: Here we have used mode as “r” to read the data, because the target file has text data. In case we are reading some binary file, we need to use “rb” as the mode.
Example 2: We can also use the with statement to append or write data to the file.
We will append the string “Hello Lazyroar!” to our neveropen.txt file.
Python3
# appending string to file with open ( "neveropen.txt" , "a" ) as gfg_file: gfg_file.write( "\nHello Geeks!" ) # reading the file contents # to verify if successfully appended the data with open ( "neveropen.txt" , "r" ) as gfg_file: content = gfg_file.read() print (content) |
Output:
GeeksForGeeks is best for DSA Hello Geeks!
Note: Here we have used “a” as the mode of opening the file, this is because we want to append to the file data. Instead, if we wanted to overwrite the file data, we would use the “w” mode.
Example 3: Using nested with open statement to open multiple files
We have defined a links.txt file containing some random links. We will open the neveropen.txt file mentioned above and append the content of the links file into the neveropen.txt file.
Python3
# appending string to file with open ( "neveropen.txt" , "a" ) as gfg_file: gfg_file.write( "\nHello Geeks!" ) with open ( "links.txt" , 'r' ) as links_file: lines = links_file.readlines() gfg_file.writelines(lines) |
neveropen.txt file contents after modification:
Here, we can see that the contents of the links.txt file has been added to the neveropen.txt file after running the script.
Difference of using open() vs with open()
Although the function of using open() and with open() is exactly same but, there are some important differences:
- Using open() we can use the file handler as long as the file has not been explicitly closed using file_handler.close(), but in case of using with open() context manager, we cannot use a file handler outside the with block. It will raise ValueError: I/O operation on closed file in that case.
- While using open() we need to explicitly close an opened file instance, else other parts of code may face errors while opening the same file. In with open() the closing of the file is handled by the context manager.
- Using with open() context statement makes the code more tidy as we can easily separate between code block by difference in indents. In case of open(), we might miss closing the file instance, this may cause memory leaks and other I/O operation errors.