File read-write mode: problem appending after reading

Frederic Rentsch anthra.norell at vtxmail.ch
Sat Oct 14 16:03:46 EDT 2006


Tim,
      Thanks a lot for your input. I seemed to notice that  everything 
works fine without setting the cursor as long as it stops before the end 
of the file. Is that also a coincidence that may not work?
Frederic


Tim Peters wrote:
> [Frederic Rentsch]
>   
>>    Working with read and write operations on a file I stumbled on a
>> complication when writes fail following a read to the end.
>>
>>  >>> f = file ('T:/z', 'r+b')
>>  >>> f.write ('abcdefg')
>>  >>> f.tell ()
>> 30L
>>  >>> f.seek (0)
>>  >>> f.read ()
>> 'abcdefg'
>>  >>> f.flush ()  # Calling or not makes no difference
>>  >>> f.write ('abcdefg')
>>     
>
> Nothing is defined about what happens at this point, and this is
> inherited from C.  In standard C, if you want to read following a
> write, or write following a read, on the same stream, you must perform
> a file-positioning operation (typically a seek) between them.
>
>   
>> Traceback (most recent call last):
>>   File "<pyshell#62>", line 1, in -toplevel-
>>     f.write ('abcdefg')
>> IOError: (0, 'Error')
>>     
>
> That's one possible result.  Since nothing is defined, any other
> outcome is also a possible result ;-)
>
>   
>> Flushing doesn't help.
>>     
>
> Right, and because flush() is not a file-positioning operation.
>
>   
>> I found two work arounds:
>>
>>  >>> f.read ()
>> 'abcdefg'
>>  >>> f.read ()   # Workaround 1: A second read (returning an empty string)
>> ''
>>  >>> f.write ('abcdefg')
>> (No error)
>>     
>
> Purely an accident; may or may not "work" the next time you try it, or
> on another platform; etc.
>
>   
>>  >>> f.read ()
>> 'abcdefg'
>>  >>> f.seek (f.tell ())   # Workaround 2: Setting the cursor (to where it is!)
>>     
>
> That's a correct approach.  f.seek(0, 1) (seek 0 bytes from the
> current position) is a little easier to spell.
>
>   
>>  >>> f.write ('abcdefg')
>> (No error)
>>
>> I found no problem with writing into the file. So it looks like it has
>> to do with the cursor which a read puts past the end, unless it is past
>> the end, in which case it goes back to the end. Is there a less kludgy
>> alternative to "fseek (ftell ())"?
>>     
>
> As above, you need to seek when switching from reading to writing, or
> from writing to reading.
>   




More information about the Python-list mailing list