Strange loop behavior

G

Gabriel Rossetti

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.

--
Arimaz SA
Av. du 24 Janvier 11
Ateliers de la Ville de Renens, Atelier 5
1020 Renens, Switzerland
www.mydeskfriend.com
Mob: +41-(0)79-539-0069
 
P

Peter Otten

Gabriel said:
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))

And yes I checked, the "d" variable is en empty string at some point, so
the looping should stop.

d may be an empty string, but repr(d) isn't:

Remove the two repr() calls and you should be OK.

Peter
 
D

Diez B. Roggisch

Gabriel said:
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.

But you used a superfluous repr. Look at this:

So - get rid of the useless repr, then things should work.


Regarding the behavior in the debugger: that's an artifact of the
debugger that it doesn't step into that line, it doesn't change the way
the code works.

Diez
 
A

Arnaud Delobelle

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 "''":
''

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?
 
G

Gabriel Rossetti

Arnaud said:
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 "''":

''

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?
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,276
Latest member
Sawatmakal

Latest Threads

Top