problem with read() write()

Alf P. Steinbach alfps at start.no
Sat Oct 31 15:40:02 CET 2009


* Zeynel:
> On Oct 31, 9:55 am, "Alf P. Steinbach" <al... at start.no> wrote:
>> * Zeynel:
>>
>>
>>
>>
>>
>>> On Oct 31, 9:23 am, "Alf P. Steinbach" <al... at start.no> wrote:
>>>> * Zeynel:
>>>>> Hello,
>>>>> I've been studying the official tutorial, so far it's been fun, but
>>>>> today I ran into a problem with the write(). So, I open the file pw
>>>>> and write "hello" and read:
>>>>> f = open("pw", "r+")
>>>>> f.write("hello")
>>>>> f.read()
>>>>> But read() returns a bunch of what looks like meta code:
>>>>> "ont': 1, 'center_insert_even\xc4\x00K\x02\xe8\xe1[\x02z\x8e
>>>>> \xa5\x02\x0b
>>>>> \x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0 0'QUEUE'\np1\n
>>>>> (S'exec' ....
>>>>> What am I doing wrong? Thank you.
>>>> After the 'write' the current position in the file is after the "hello", so
>>>> reading will read further content from there.
>>>> The following works (disclaimer: I'm utter newbie in Python, and didn't consult
>>>> the documentation, and it's the first time I've seen the Python 'open'):
>>>> f = open("pw", "r+")
>>>> f.write( "hello" )
>>>> f.seek( 0 )  # Go back to start of file
>>>> f.read()
>>>> f.close()
>>>> Cheers & hth.,
>>>> - Alf
>>> Thanks, but it didn't work for me. I still get the meta file. Although
>>> I see that "hello" is there.
>> Just a thought: try "w+" instead of "r+".
>>
>> Because if you do
>>
>>    print( open.__doc__ )
>>
>> as I recall it said something about "w" truncating the file?
>>
>> Cheers & hth.,
>>
>> - Alf
> 
> No :) I still got the same thing.

Hm. Now I had to look in the docs because I thought I'd given bad advice.

Doc of 'open' says:

   "The mode 'w+' opens and truncates the file to 0 bytes, while 'r+' opens the
    file without truncation."

So with 'w+' the only way to get garbage is if 'read' reads beyond the end of 
file, or 'open' doesn't conform to the documentation.

Testing with Python 3.1.1 under Windows XP Pro:

<example>
 >>> f = open( "zilly", "w+" )
 >>> f.write( "garbagegarbagegarbagegarbagegarbagegarbagegarbagegarbagegarbage" )
63
 >>> f.close()
 >>> f = open( "zilly", "r" )
 >>> f.read()
'garbagegarbagegarbagegarbagegarbagegarbagegarbagegarbagegarbage'
 >>> f.close()
 >>> f.open( "zilly", "r+" )
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: '_io.TextIOWrapper' object has no attribute 'open'
 >>> open( "zilly", "r+" )
<_io.TextIOWrapper name='zilly' encoding='cp1252'>
 >>> f = open( "zilly", "r+" )
 >>> f.write( "hello" )
5
 >>> f.seek( 0 )
0
 >>> f.read()
'hellogegarbagegarbagegarbagegarbagegarbagegarbagegarbagegarbage'
 >>> f.close()
 >>> f = open( "zilly", "w+" )
 >>> f.write( "hello" )
5
 >>> f.seek( 0 )
0
 >>> f.read()
'hello'
 >>> f.close()
 >>>
</example>

The "w+" works here. Even if I made a typing mistake and apparently left the 
file open in the middle there.


Cheers & hth.,

- Alf



More information about the Python-list mailing list