Opening files without closing them

Peter Hansen peter at engcorp.com
Tue Mar 7 20:29:15 CET 2006


3c273 wrote:
> "Robert Kern" <robert.kern at gmail.com> wrote in message
> news:mailman.2794.1141683892.27775.python-list at python.org...
> 
>>Paul Rubin wrote:
>>
>>>Say that the open is inside the try block.  If the file can't be
>>>opened, then 'open' raises an exception, 'f' doesn't get set, and then
>>>the 'finally' clause tries to close f.  f might have been previously
>>>bound to some other file (which still has other handles alive) and so
>>>the wrong file gets closed.
>>
>>And even if 'f' wasn't bound to anything, you will get a NameError instead
> 
> of
> 
>>the exception that you're really interested in seeing.
> 
> 
> Thanks to both of you. So in order to be thorough, should I be doing:
> try:
>     f=open('file')
> except: IOError:
>     print 'doesn't exist'
>     so_something_else_instead()
> 
> try:
>     contents = f.read()
> finally:
>     f.close()

Unfortunately, that would still have trouble if the first exception 
handler was executed, since then you'd try read from f, which would fail 
with another exception, and then you'd try to close f, and that would 
probably fail and raise an exception that isn't caught anywhere.

So this is better, though probably excessive in small scripts:

try:
     f = open('file')
except IOError:
     # do something else
else:
     try:
         content = f.read()
     finally:
         f.close()

This takes advantage of "else" on try statements, which executes only if 
the except statement is not executed.

-Peter




More information about the Python-list mailing list