Reading a file and then writing something back

Remy Blank remy.blank_asps at pobox.com
Wed Jul 21 10:40:17 EDT 2004


Kevin T. Ryan wrote:
> I'm not sure, but I'm wondering if this is a bug, or maybe (more
> likely) I'm misunderstanding something...see below:
> 
> 
>>>>f = open('testfile', 'w')
>>>>f.write('kevin\n')
>>>>f.write('dan\n')
>>>>f.write('pat\n')
>>>>f.close()
>>>>f = open('testfile', 'r+')
>>>>f.readline()
> 
> 'kevin\n'
> 
>>>>f.readline()
> 
> 'dan\n'
> 
>>>>f.write('chris\n')
> 
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
> IOError: (0, 'Error')

This is just a guess, I don't know the inner workings of files in 
Python, but here we go:

I think that readline() doesn't read one character at a time from the 
file, until it finds a newline, but reads a whole block of characters, 
looks for the first newline and returns that string (for efficiency 
reasons). Due to this buffering, the file pointer position is undefined 
after a readline(), and so a write() afterwards doesn't make sense. 
Python tries to help you not to fall into this trap.

> I've figured out that I can do an open('testfile', 'r+') and then seek
> and write something (without an error), but it just seems odd that I
> would get an IOError for what I was trying to do.

When you do a seek(), the file pointer position is clearly defined, so a 
write() makes sense.

A tentative solution could be:

pos = f.tell()
s = f.readline()         # Reads 'dan\n'
f.seek(pos + len(s))
f.write('chris\n')

However, I'm not sure you want to do that, as the string written will 
just overwrite the previous content, and will probably not be aligned 
with the next newline in the file. Except if you don't care about the 
data following your write.

Hope this helps.
-- Remy


Remove underscore and anti-spam suffix in reply address for a timely 
response.



More information about the Python-list mailing list