Strange loop behavior

Gabriel Rossetti gabriel.rossetti at mydeskfriend.com
Wed Mar 26 05:07:28 EDT 2008


Arnaud Delobelle wrote:
> On Mar 26, 8:35 am, Gabriel Rossetti
> <gabriel.rosse... at mydeskfriend.com> wrote:
>   
>> Hello,
>>
>> I wrote a program that reads data from a file and puts it in a string,
>> the problem is that it loops infinitely and that's not wanted, here is
>> the code :
>>
>>     d = repr(f.read(DEFAULT_BUFFER_SIZE))
>>     while d != "":
>>         file_str.write(d)
>>         d = repr(f.read(DEFAULT_BUFFER_SIZE))
>>
>> I also tried writing the while's condition like so : len(d) > 0, but
>> that doesn't change anything. I tried step-by-step debugging using
>> PyDev(eclipse plugin) and I noticed this, once the while was read once,
>> it is never re-read, basically, the looping does happen, but just in
>> between the two lines in the loop's body/block, it never goes on the
>> while and thus never verifies the condition and thus loops forever. I
>> had been using psyco (a sort of JIT for python) and so I uninstalled it
>> and restarted eclipse and I still get the same thing. This looks like
>> some bug, but I may be wrong, does anybody understand what's going on here?
>>
>> Thanks,
>> Gabriel
>>
>> PS
>> And yes I checked, the "d" variable is en empty string at some point, so
>> the looping should stop.
>>     
>
> No, it isn't the empty string, it is the printable representation of
> the empty string (because you wrap your f.read() calls in repr()),
> which is the string "''":
>
>     >>> print "''"
>     ''
>
> Why do you wrap f.read(...) in the repr() function?  If you remove the
> two repr() I suspect your code will work.
>
> OTOH do you know that the read() method of file objects does what you
> want?  You could simply write:
>
>     file_str = f.read()
>
> Or are there some other factors that prevent you from doing this?
>
> --
> Arnaud
>
>   
Ok, like I mentioned in my second msg, I had put repr() there because I 
was getting errors because the ascii range (128) was exceeded, I tried 
cheating and telling it it was unicode but that didn't work, so I tried 
repr() and it gave me a string rep. of my data, that was ok. After that 
I tried using StringIO instead of what I had before, a list of strings 
that I later joined with an empty string. I just re-tried removing the 
repr() and it works with the StringIO version.

Thanks for all your answers,
Gabriel



More information about the Python-list mailing list