5 ms·
I often use: for line in open("name.txt"): print line # Or do something else with it.
by Luyt 15y ago
I often use:
for line in open("name.txt"):
print line # Or do something else with it.
- reinhardt 15y agoMe too when I'm lazy but we shouldn't; it happens to work fine on CPython but on implementations use garbage collection instead of reference counting (e.g. Jython) it leaks file handlers. The "with" statement is the right cross-platform way to handle resources.
- rbanffy 15y agoI'd imagine it's an implementation bug. Once the iterator finishes, the file should be closed and the file handler freed.
- yangyang 15y agoPerhaps in this case - but how about a case where you partially iterate over the file, but then the file object goes out of scope? CPython would close (and free) that immediately, but other implementations probably wouldn't.
- rbanffy 15y agoWhile editing the answer to masklinn comment, this case came to me. You both are, of course, right. There is no reliable way to close the file from the for iterator. :-/
- masklinn 15y ago> I'd imagine it's an implementation bug. No, it's a code bug. > Once the iterator finishes, the file should be closed and the file handler freed. There is no reason for that to happen, let alone for that to happen deterministically.
- rbanffy 15y agoIndeed. In generational garbage collectors, the file object may remain until the collector decides to collect it. But isn't the file object also raising a StopIteration error? Shouldn't it at least close itself then?
- axiak 15y agoYou can always fp.seek(0) and iterate again. Iteration and file openness are separate concepts, and any API worth its salt (e.g. the python file api) keeps it that way.
- euccastro 15y agoIf you've opened that file in the right mode, you can conceivably append to it once you reach its end. Even in read only mode, I imagine you may conceivably seek back for further reading?
- rbanffy 15y agoThat wouldn't be the idiomatic "for line in file" loop.
- masklinn 15y agoAs far as iteration goes, there is no difference between for line in open(somepath): # stuff and f = open(somepath) for line in f: # stuff and the second case would be outright broken if the file just decided to close itself when it stops iterating (as others noted, the developer may now want to append new content, or use file.seek and fly around the file's content). Not to mention a major issue: `break`. The iterator gets no mention of breaks and the iteration is not terminated at this point (as far as the iterator is concerned, that is) so adding a `break` to your iteration (to stop it early because you've found the data/line you needed in a linear search) would suddenly start leaking file handlers where those were collected beforehand... not good.
- 15y ago