469,589 Members | 2,048 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,589 developers. It's quick & easy.

file.read() returns an emtpy even if its currenet position is not atthe end

js
Hi list.

I'm writing a tail -f like program in python
and I found file.read() doesn't work as I think it should.

Here's the code illustrating my problem.

###
#!/usr/bin/env python
import os, sys
filename = "test.out"

f = open(filename, "w+")
f.write("Hello")
f.flush()

f.seek(0, 2)

statinfo = os.stat(filename)
print "file size: %d" % statinfo.st_size
print "position : %d" % f.tell()
line = f.read()
print "line : [%s]" % line

# Writing the same file using another fd
f2 = open(filename, "a+")
f2.write("World")
f2.flush()
f2.close()

statinfo = os.stat(filename)
print "file size: %d" % statinfo.st_size
print "position : %d" % f.tell()
line = f.read() # read() returns emtpy!! readlines?() works ok
###

Running the above, I got the following.
###
file size: 5
position : 5
line : []
file size: 10
position : 5
###

So my question is
why the second f.read() returns an emtpy?
>From tell() and its st_size I'm sure that file descriptor is not at the EOF
and read()'s doc says
"An empty string is returned when EOF is encountered immediately".
Using readline() or readlines() instead of read() works great though.

I'm using Python 2.4.3 on OS X.

Probably I'm missing something but I could't figure out.

Thanks in advance.
Apr 22 '07 #1
2 1749
On Apr 22, 6:51 pm, "js " <ebgs...@gmail.comwrote:
Hi list.

I'm writing a tail -f like program in python
and I found file.read() doesn't work as I think it should.

Here's the code illustrating my problem.

###
#!/usr/bin/env python
import os, sys
filename = "test.out"

f = open(filename, "w+")
f.write("Hello")
f.flush()

f.seek(0, 2)

statinfo = os.stat(filename)
print "file size: %d" % statinfo.st_size
print "position : %d" % f.tell()
line = f.read()
print "line : [%s]" % line

# Writing the same file using another fd
f2 = open(filename, "a+")
f2.write("World")
f2.flush()
f2.close()

statinfo = os.stat(filename)
print "file size: %d" % statinfo.st_size
print "position : %d" % f.tell()
line = f.read() # read() returns emtpy!! readlines?() works ok
###

Running the above, I got the following.
###
file size: 5
position : 5
line : []
file size: 10
position : 5
###

So my question is
why the second f.read() returns an emtpy?>From tell() and its st_size I'm sure that file descriptor is not at the EOF

and read()'s doc says
"An empty string is returned when EOF is encountered immediately".
Using readline() or readlines() instead of read() works great though.

I'm using Python 2.4.3 on OS X.

Probably I'm missing something but I could't figure out.

Thanks in advance.
I've hit into the same issue recently when implementing more or less
the same thing and found that doing f.seek(f.tell()) on the file
object when empty strings start to come out allows you to continue
read()ing after hitting EOF if the file grows again.

I finally dropped the "hack" and used readline instead since it made
me a little bit uneasy though...

Alberto

Apr 22 '07 #2
js
Thank you for reply.

I've just found the bug report on this.
http://sourceforge.net/tracker/index...70&atid=105470

Nobody seems to be working on this, though.

On 22 Apr 2007 14:41:29 -0700, Alberto Valverde <al*****@toscat.netwrote:
On Apr 22, 6:51 pm, "js " <ebgs...@gmail.comwrote:
Hi list.

I'm writing a tail -f like program in python
and I found file.read() doesn't work as I think it should.

Here's the code illustrating my problem.

###
#!/usr/bin/env python
import os, sys
filename = "test.out"

f = open(filename, "w+")
f.write("Hello")
f.flush()

f.seek(0, 2)

statinfo = os.stat(filename)
print "file size: %d" % statinfo.st_size
print "position : %d" % f.tell()
line = f.read()
print "line : [%s]" % line

# Writing the same file using another fd
f2 = open(filename, "a+")
f2.write("World")
f2.flush()
f2.close()

statinfo = os.stat(filename)
print "file size: %d" % statinfo.st_size
print "position : %d" % f.tell()
line = f.read() # read() returns emtpy!! readlines?() works ok
###

Running the above, I got the following.
###
file size: 5
position : 5
line : []
file size: 10
position : 5
###

So my question is
why the second f.read() returns an emtpy?>From tell() and its st_size I'm sure that file descriptor is not at the EOF

and read()'s doc says
"An empty string is returned when EOF is encountered immediately".
Using readline() or readlines() instead of read() works great though.

I'm using Python 2.4.3 on OS X.

Probably I'm missing something but I could't figure out.

Thanks in advance.

I've hit into the same issue recently when implementing more or less
the same thing and found that doing f.seek(f.tell()) on the file
object when empty strings start to come out allows you to continue
read()ing after hitting EOF if the file grows again.

I finally dropped the "hack" and used readline instead since it made
me a little bit uneasy though...

Alberto

--
http://mail.python.org/mailman/listinfo/python-list
Apr 22 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

6 posts views Thread by Russell E. Owen | last post: by
9 posts views Thread by Use*n*x | last post: by
19 posts views Thread by Lee Crabtree | last post: by
4 posts views Thread by MikeJ | last post: by
13 posts views Thread by thomas.mertes | last post: by
reply views Thread by suresh191 | last post: by
4 posts views Thread by guiromero | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.