Reading from stdin

Luis Zarrabeitia kyrie at uh.cu
Wed Oct 8 09:28:55 EDT 2008


On Tuesday 07 October 2008 11:27:19 pm George Sakkis wrote:
> """
> In order to make a for loop the most efficient way of looping over the
> lines of a file (a very common operation), the next() method uses a
> hidden read-ahead buffer. As a consequence of using a read-ahead
> buffer, combining next() with other file methods (like readline())
> does not work right.
> """
>
> I guess the phrasing "hidden read-ahead buffer" implies that buffering
> cannot be turned off (or at least it is not intended to even if it's
> somehow possible).

Hmm. I wonder how those optimizations look like. Apparently, readline() cannot 
read from that read-ahead buffer, and that by itself sounds bad. Currently, 
if you loop a few times with next, you cannot use readline afterwards until 
you seek() to an absolute position.

Actually, I think I may be replying to myself here. I imagine that 'next' will 
read a block instead of a character, and look for lines in there, and as the 
underlying OS likely blocks until the whole block is read, 'next' cannot 
avoid it. That doesn't explain, though, why readline() can't use next's 
buffer, why next doesn't have a sensible timeout for interactive sessions 
(unless the OS doesn't support it), and why the readahead cannot be turned 
off.

I think I'll have to stick for now with the iter(function,sentinel) solution.

And I may try to find next()'s implementation... I guess I'll be downloading 
python's source when my bandwidth allows it (or find it on a browseable 
repository)

On a related note, help(file.read) shows:

=====
read(...)
    read([size]) -> read at most size bytes, returned as a string.

    If the size argument is negative or omitted, read until EOF is reached.
    Notice that when in non-blocking mode, less data than what was requested
    may be returned, even if no size parameter was given.
=====

But it doesn't say how to put the file object in non-blocking mode. (I was 
trying to put the file object in non-blocking mode to test next()'s 
behavior). ??Ideas?

-- 
Luis Zarrabeitia (aka Kyrie)
Fac. de Matemática y Computación, UH.
http://profesores.matcom.uh.cu/~kyrie



More information about the Python-list mailing list