Checking for EOF in stream

Gabriel Genellina gagsl-py at yahoo.com.ar
Mon Feb 19 20:50:25 EST 2007


En Mon, 19 Feb 2007 21:50:11 -0300, GiBo <gibo at gentlemail.com> escribió:

> Grant Edwards wrote:
>> On 2007-02-19, GiBo <gibo at gentlemail.com> wrote:
>>>
>>> Classic situation - I have to process an input stream of unknown length
>>> until a I reach its end (EOF, End Of File). How do I check for EOF? The
>>> input stream can be anything from opened file through sys.stdin to a
>>> network socket. And it's binary and potentially huge (gigabytes), thus
>>> "for line in stream.readlines()" isn't really a way to go.
>>>
>>> For now I have roughly:
>>>
>>> stream = sys.stdin
>>> while True:
>>> 	data = stream.read(1024)
>>         if len(data) == 0:
>>              break  #EOF
>>> 	process_data(data)
>
> Right, not a big difference though. Isn't there a cleaner / more
> intuitive way? Like using some wrapper objects around the streams or
> something?

Read the documentation... For a true file object:
read([size]) ... An empty string is returned when EOF is encountered  
immediately.
All the other "file-like" objects (like StringIO, socket.makefile, etc)  
maintain this behavior.
So this is the way to check for EOF. If you don't like how it was spelled,  
try this:

   if data=="": break

If your data is made of lines of text, you can use the file as its own  
iterator, yielding lines:

for line in stream:
     process_line(line)

-- 
Gabriel Genellina




More information about the Python-list mailing list