Using a context manager via the with statement
A Python file object is generally entangled with OS resources. When we're done using the file, we need to be sure that the file is properly closed so that the OS resources can be released. For small command-line applications, this consideration is not that important: when we exit from Python, and the reference counts for all objects are decreased to zero, the files will be closed during object delete processing.
For a large, long-running server, however, files that are not properly closed will accumulate OS resources. Since pools of OS resources are finite, a file handle leak will, eventually, cause problems.
As a general practice, we can use a context manager to be sure that files are closed when we're done using them. The idea is to constrain an open file to the suite of statements within the context manager. Once that suite of statements is finished, the context manager will ensure that the file is closed.
We specify the context using the with...