Edit: The idiom's mentioned in the Python docs on IO [1] as "memory efficient, fast, and leads to simple code"
[1] http://docs.python.org/2/tutorial/inputoutput.html#methods-o...
Another option is using mmap[1], particularly when the file is already in memory or you need more random access to it. It worked well when I was trying to parse some lines from the end of an open log file.
In CPython, since reference counting is used for GC, this occurs when the loop exits. However, other implementations (e.g. PyPy) may use different schemes that do not guarantee collection as soon as objects go out of scope. As an extreme, a valid and occasionally useful GC strategy is to never collect anything at all [0]!
Hence, if you want to portably ensure the file is closed, you should either use the context manager or call close() explicitly.
[0] http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047...