On Tue, Feb 16, 2016 at 7:39 PM,  <jf...@ms4.hinet.net> wrote:
> I know
>
>     with open('foo.txt') as f:
>         ...do something...
>
> will close the file automatically when the "with" block ends.
>
> I also saw codes in a book:
>
>     for line in open('foo.txt'):
>         ...do something...
>
> but it didn't mention if the file will be closed automatically or not when 
> the "for" block ends. Is there any document talking about this? and how to 
> know if a file is in "open" or not?
>

The file will be closed when the open file object is disposed of. That
will happen at some point after there are no more references to it.
You're guaranteed that it stays around for the entire duration of the
'for' loop (the loop keeps track of the thing it's iterating over),
but exactly when after that is not guaranteed. In current versions of
CPython, the garbage collector counts references, so the file will be
closed immediately; but other Python interpreters, and future versions
of CPython, may not behave the same way. So the file will *probably*
be closed *reasonably* promptly, but unlike the "with" case, you have
no guarantee that it'll be immediate.

For small scripts, it probably won't even matter, though. You're
unlikely to run out of file handles, and the only time it would matter
is if you're opening, closing, and then reopening the file - for
example:

fn = input("Name a file to frobnosticate: ")
with open(fn) as f:
    data = []
    for line in f:
        data = frobnosticate(data, line)
with open(fn, "w") as f:
    f.writelines(data)

For this to work reliably, the file MUST be closed for reading before
it's opened for writing. The context managers are important. But this
is pretty unusual.

Of course, since it's so little trouble to use the 'with' block, it's
generally worth just using it everywhere. Why run the risk? :)

ChrisA
who often forgets to use 'with' anyway
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to