String Fomat Conversion

Alex Martelli aleaxit at yahoo.com
Thu Jan 27 13:29:57 EST 2005


Steven Bethard <steven.bethard at gmail.com> wrote:
   ...
> Beware of mixing iterator methods and readline:

_mixing_, yes.  But -- starting the iteration after some other kind of
reading (readline, or read(N), etc) -- is OK...


> http://docs.python.org/lib/bltin-file-objects.html
> 
> next(         )
>      ...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 haven't tested your code in particular, but this warning was enough to
> make me generally avoid mixing iter methods and other methods.

Yeah, I know... it's hard to explain exactly what IS a problem and what
isn't -- not to mention that this IS to some extent a matter of the file
object's implementation and the docs can't/don't want to constrain the
implementer's future freedom, should it turn out to matter.  Sigh.

In the Nutshell (2nd ed), which is not normative and thus gives me a tad
more freedom, I have tried to be a tiny bit more specific, taking
advantage, also, of the fact that I'm now addressing the 2.3 and 2.4
implementations, only.  Quoting from my current draft (pardon the XML
markup...):

"""
interrupting such a loop prematurely (e.g., with <c>break</c>), or
calling <r>f</r><c>.next()</c> instead of <r>f</r><c>.readline()</c>,
leaves the file's current position at an arbitrary value.  If you want
to switch from using <r>f</r> as an iterator to calling other reading
methods on <r>f</r>, be sure to set the file's current position to a
known value by appropriately calling <r>f</r><c>.seek</c>.
"""

I hope this concisely indicates that the problem (in today's current
implementations) is only with switching FROM iteration TO other
approaches to reading, and (if the file is seekable) there's nothing so
problematic here that a good old 'seek' won't cure...


Alex



More information about the Python-list mailing list