Reading text files where last line has no EOL

BlueBird phil at freehackers.org
Mon Sep 17 08:02:38 EDT 2007


On 17 sep, 13:24, Steve Holden <st... at holdenweb.com> wrote:
> BlueBird wrote:
> > I tried and failed to read text files where the last line does not
> > contain proper EOL. For my tests, I use a file that I create with the
> > equivalent of :
>
> > open('toto', 'w').write( '1234\n4567\n89AB' )
>
> > My reading code looks like this :
>
> >        l = f.readline()
> >         while len(l):
> >             self.appendLine( l )
> >             l = f.readline()
>
> > The last line is not returned (89AB) is never returned.
>
> > I tried with "for l in f" with similar results.
>
> > I read the doc :
>
> > 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. However, using seek() to reposition the file to
> > an absolute position will flush the read-ahead buffer. New in version
> > 2.3.
>
> > I've tried to do a f.seek( f.tell() ) but that did not help.
>
> > So how am I supposed to fetch that last line ?
>
> What version of Python are you using, and on what platform? WJFFM on
> 2.5.1/Cygwin:
>
>  >>> open('toto', 'w').write( '1234\n4567\n89AB' )
>  >>> for l in open('toto'):
> ...   print l
> ...
> 1234
>
> 4567
>
> 89AB
>  >>>
>
> You will observe that the last line is presented, but correctly does not
> include a trailing line feed.
>

Oooooooops. It was a stupid bug in my script: textLine[:-
int(textLine[-1]=='\n')] is not what I want (the real code was not a
one-liner)! The documentation made me think that something wrong was
going on with python but I should have known better.

Thanks.








More information about the Python-list mailing list