Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python 2.7 carriage return countdown

I'm having trouble implementing a simple countdown in python using a carriage return. I have two versions, each with problems.

Print Version:

for i in range(10):
    print "\rCountdown: %d" % i
    time.sleep(1)

Problem: The \r doesn't do anything because a newline is printed at the end, so it gives the output:

Countdown: 0
Countdown: 1
Countdown: 2
Countdown: 3
Countdown: 4
Countdown: 5
Countdown: 6
Countdown: 7
Countdown: 8
Countdown: 9

Sys.stdout.write Version:

for i in range(10):
    sys.stdout.write("\rCountdown: %d" % i)
    time.sleep(1)
print "\n"

Problem: All the sleep happens at the beginning, and after 10 seconds of sleep it just prints Countdown: 9 to the screen. I can see the \r is working behind the scenes, but how do I get the prints to be interspersed in the sleep?

like image 978
Kvass Avatar asked Jul 02 '13 21:07

Kvass


3 Answers

For solution number 2, you need to flush stdout.

for i in range(10):
    sys.stdout.write("\rCountdown: %d" % i)
    sys.stdout.flush()
    time.sleep(1)
print ''

Also, just print an empty string since print will append the newline. Or use print '\n' , if you think it is more readable as the trailing comma suppresses the newline that would typically be appended.

Not sure how to fix the first one though...

like image 164
Brian Avatar answered Sep 25 '22 03:09

Brian


For solution 1 (the Print Version), including a comma at the end of the print statement will prevent a newline from being printed at the end, as indicated in the docs. However, stdout still needs to be flushed as Brian mentioned.

for i in range(10):
    print "\rCountdown: %d" % i,
    sys.stdout.flush()
    time.sleep(1)

An alternative is to use the print function, but sys.stdout.flush() is still needed.

from __future__ import print_function
for i in range(10):
    print("\rCountdown: %d" % i, end="")
    sys.stdout.flush()
    time.sleep(1)
like image 22
ogdenkev Avatar answered Sep 25 '22 03:09

ogdenkev


I use

import time
for i in range(0,10):
    print "countdown: ",10-i
    time.sleep(1)    
    print chr(12)#clear screen
print "lift off"
like image 32
spector0714 Avatar answered Sep 24 '22 03:09

spector0714