Reading text files where last line has no EOL

B

BlueBird

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 ?
 
S

Steve Holden

BlueBird said:
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:
.... print l
....
1234

4567

89AB
You will observe that the last line is presented, but correctly does not
include a trailing line feed.

regards
Steve

--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden

Sorry, the dog ate my .sigline
 
S

Steve Holden

BlueBird said:
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:
.... print l
....
1234

4567

89AB
You will observe that the last line is presented, but correctly does not
include a trailing line feed.

regards
Steve

--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden

Sorry, the dog ate my .sigline
 
B

BlueBird

What version of Python are you using, and on what platform? WJFFM on
2.5.1/Cygwin:

... 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.
 
G

Gabriel Genellina

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.

If that expression is supposed to remove the trailing newline, I suggest
using
textLine = textLine.rstrip('\n')
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top