For file I/O what is the purpose of:
with open
and should I use it instead of:
f=open('file', 'w')
f.write('foo)'
f.close()
Always use the with statement
.
From docs:
It is good practice to use the with keyword when dealing with file objects. This has the advantage that the file is properly closed after its suite finishes, even if an exception is raised on the way. It is also much shorter than writing equivalent
try-finally
blocks.
If you don't close the file explicitly then the file object may hang around in the memory until it is garbage collected, which implicitly calls close()
on the file object. So, better use the with
statement, as it will close the file explicitly even if an error occurs.
Related: Does a File Object Automatically Close when its Reference Count Hits Zero?
Yes. You should use with
whenever possible.
This is using the return value of open
as a context manager. Thus with
is used not just specifically for open
, but it should be preferred in any case that some cleanup needs to occur with regards to the object (that you would normally put in a finally
block). In this case: on exiting the context, the .close()
method of the file object is invoked.
Another good example of a context manager "cleaning up" is threading
's Lock
:
lock = Lock()
with lock:
#do thing
#lock is released outside the context
In this case, the context manager is .release()
-ing the lock.
Anything with an __enter__
and __exit__
method can be used as a context manager. Or, better, you can use contextlib
to make context managers with the @contextmanager
decoration. More here.
Basically what it is trying to avoid is this:
set things up
try:
do something
finally:
tear things down
but with the with
statement you can safely, say open a file and as soon as you exit the scope of the with
statement the file will be closed.
The with
statement calls the __enter__
function of a class, which does your initial set up and it makes sure it calls the __exit__
function at the end, which makes sure that everything is closed properly.
The with
statement is a shortcut for easily writing more robust code. This:
with open('file', 'w') as f:
f.write('foo')
is equivalent to this:
try:
f = open('file', 'w')
f.write('foo')
finally:
f.close()