Will file be closed automatically in a "for ... in open..." statement?

Steven D'Aprano steve+comp.lang.python at pearwood.info
Wed Feb 17 00:51:31 EST 2016


On Wednesday 17 February 2016 15:04, jfong at ms4.hinet.net wrote:

> Thanks for these detailed explanation. Both statements will close file
> automatically sooner or later and, when considering the exceptions, "with"
> is better. Hope my understanding is right.
> 
> But, just curious, how do you know the "for" will do it? I can't find any
> document about it from every sources I know. Very depressed:-(

This has nothing to do with "for". You would get exactly the same behaviour 
without "for":


f = open("some file", "r")
x = f.read(20)
x = f.read(30)
x = f.read()


So long as the variable "f" is in-scope, the file will stay open. If the 
above code is in a function, "f" goes out of scope when the function 
returns. If the above code is at the top level of the module, "f" will stay 
in scope forever, or until you either delete the variable from the scope:

del f

or re-assign to something else:

f = "hello world"


At this point, after the function has exited, and the variable has 
completely gone out of scope, what happens?

The garbage collector will:

- reclaim the memory used by the object;
- close the file.

BUT there is no promise WHEN the file will be closed. It might be 
immediately, or it might be when the application shuts down.

If you want the file to be closed immediately, you must:

- use a with statement;

- or explicitly call f.close()


otherwise you are at the mercy of the interpreter, which will close the file 
whenever it wants.


-- 
Steve



More information about the Python-list mailing list