Carl Banks wrote:
On May 23, 2:20 am, Joel Ross <jo...@cognyx.com> wrote:
Carl Banks wrote:
On May 22, 10:33 pm, Joel Ross <jo...@cognyx.com> wrote:
Hi all,
I'm using python 2.5 and trying to flush the sys.stout buffer with
sys.stout.flush(), but doesn't seem to work. Each time a line is printed
   it appends the one before it I need to clear the output and write a
new output without appending the previous one.
That's not how streams work, chief.  Once you output (and flush)
something you can't un-output it.
What you probably want to do is to write a carriage return ("\r")
which usually causes the cursor to return to the beginning of the
line, so that any new text you write overwrites the old text.
This has nothing to do with flushing; flushing doesn't erase or clear
the old input.  Flushing is usually needed for a different reason,
however, namely standard output doesn't actually get sent to the
console until it sees a newline ("\n") unless you flush the buffer.
Try to adapt this example to your problem:
for i in xrange(11):
    sys.stdout.write('*'*(10-i) + ' '*i + '\r')
    sys.stdout.flush()
    time.sleep(2)
Your example prints a new line each time,

Did you run it and observe what happened, or did you just guess what
it actually did?  On my system it doesn't print new lines.


Doesn't help me with a
progress bar, do you know of anyway doing it with the print command? My
progress bars works fine this is the only problem im having with it at
the moment. any help would be appreciated.

Well, based on the code you posted it doesn't look like your progress
bar is fine.

Anyway, you haven't described the problem you are having very well,
and we can guess what might be wrong but if you want better help
you're going to have to describe your problem more coherently.  Give
us the

1. What code are you actually running (cut-and-paste, please, don't
retype).
2. What do you expect the code to output (type in actual output you
expect to see, not merely a description).
3. What does the code actually output when you run it (cut-and paste,
please, don't just describe).
4. Include any tracebacks if there are any.

In the meantime, I repeat my suggestion that you take my example and
adapt it to what you are doing.

One other note: the print statement is unsuitable for this task
because it always prints a trailing whitespace.  Use sys.stdout.write
for it.


Carl Banks
Hey,

The only reason I didn't supply full details is because I thought it may just be something simple I was missing. Sorry for the confusing. Well here's the full code.

import sys, os
from time import sleep


class progress:

    def progressbar(self, number, total,  char):

        percentage = float(number*100)/total
        percentage = int(round(percentage))
        percentage = int(100 - percentage)
        self.f=sys.stdout
        if percentage > 0:
            char = char * percentage
            self.f.write(char)
            self.f.flush()              
            sleep(0.2)


    def countlines(self, file):

        lineCount = 0
        f = open(file)
        it = iter(f)
        try:
            while it.next():
                lineCount += 1
        except StopIteration:
                    pass
        return lineCount


def main():

    p = progress()
    lines = 5
    #lines = p.countlines("/tmp/junk")
    count = lines
    for i in xrange(lines):
        p.progressbar(count, lines, "*")
        count -=1
    print "Finished"

if __name__ == "__main__":
        main()

For now we can ignore the countlines() function. I need a nice progress display e.g. ********************** continuing on til it reaches 100% I need this to print out on one line only. At the moment it does do this, only problem is its appends the print out from the last print out. I need it to clear the last print out and then print the new print out without appending the last.

So when it prints a progress at 50% it will print 50 (*) characters and if the next progress is 51% it will print 51 (*) characters including the last 50 (*) characters, so instead on ending up with 100 (*) characters I end up with a shit load of them depending on how many lines I pass to the progressbar() function.

Needed Output:
***************************************************************************************************Finished


Current Output:
********************************************************************************************************************************************************************************************************Finished

Note: As you can see I'm only sending 5 lines to the progressbar() function and It prints this many characters, so you could imagine if I have 10000 lines I would end up with a heap of * characters.

Regards
jross






--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to