Solving problem is about exposing yourself to as many situations as possible like How to overwrite the previous print to stdout in python? and practice these strategies over and over. With time, it becomes second nature and a natural way you approach any problems in general. Big or small, always start with a plan, use other strategies mentioned here till you are confident and ready to code the solution.
In this post, my aim is to share an overview the topic about How to overwrite the previous print to stdout in python?, which can be followed any time. Take easy to follow this discuss.
If I had the following code:
for x in range(10):
print x
I would get the output of
1
2
etc..
What I would like to do is instead of printing a newline, I want to replace the previous value and overwrite it with the new value on the same line.
Answer #1:
Simple Version
One way is to use the carriage return ('r'
) character to return to the start of the line without advancing to the next line.
Python 3
for x in range(10):
print(x, end='r')
print()
Python 2.7 forward compatible
from __future__ import print_function
for x in range(10):
print(x, end='r')
print()
Python 2.7
for x in range(10):
print '{}r'.format(x),
print
Python 2.0-2.6
for x in range(10):
print '{0}r'.format(x),
print
In the latter two (Python 2-only) cases, the comma at the end of the print statement tells it not to go to the next line. The last print statement advances to the next line so your prompt won’t overwrite your final output.
Line Cleaning
If you can’t guarantee that the new line of text is not shorter than the existing line, then you just need to add a “clear to end of line” escape sequence, 'x1b[1K'
('x1b'
= ESC):
for x in range(75):
print(‘*’ * (75 - x), x, end='x1b[1Kr')
print()
Answer #2:
Since I ended up here via Google but am using Python 3, here’s how this would work in Python 3:
for x in range(10):
print("Progress {:2.1%}".format(x / 10), end="r")
Related answer here: How can I suppress the newline after a print statement?
Answer #3:
@Mike DeSimone answer will probably work most of the time. But…
for x in ['abc', 1]:
print '{}r'.format(x),
-> 1bc
This is because the 'r'
only goes back to the beginning of the line but doesn’t clear the output.
EDIT: Better solution (than my old proposal below)
If POSIX support is enough for you, the following would clear the current line and leave the cursor at its beginning:
print 'x1b[2Kr',
It uses ANSI escape code to clear the terminal line. More info can be found in wikipedia and in this great talk.
Old answer
The (not so good) solution I’ve found looks like this:
last_x = ''
for x in ['abc', 1]:
print ' ' * len(str(last_x)) + 'r',
print '{}r'.format(x),
last_x = x
-> 1
One advantage is that it will work on windows too.
Answer #4:
I had the same question before visiting this thread. For me the sys.stdout.write worked only if I properly flush the buffer i.e.
for x in range(10):
sys.stdout.write('r'+str(x))
sys.stdout.flush()
Without flushing, the result is printed only at the end out the script
Answer #5:
Suppress the newline and print r
.
print 1,
print 'r2'
or write to stdout:
sys.stdout.write('1')
sys.stdout.write('r2')
Answer #6:
for x in range(10):
time.sleep(0.5) # shows how its working
print("r {}".format(x), end="")
time.sleep(0.5) is to show how previous output is erased and new output is printed
“r” when its at the start of print message , it gonna erase previous output before new output.
Answer #7:
Try this:
import time
while True:
print("Hi ", end="r")
time.sleep(1)
print("Bob", end="r")
time.sleep(1)
It worked for me. The end="r"
part is making it overwrite the previous line.
WARNING!
If you print out hi
, then print out hello
using r
, you’ll get hillo
because the output wrote over the previous two letters. If you print out hi
with spaces (which don’t show up here), then it will output hi
. To fix this, print out spaces using r
.
Answer #8:
I couldn’t get any of the solutions on this page to work for IPython, but a slight variation on @Mike-Desimone’s solution did the job: instead of terminating the line with the carriage return, start the line with the carriage return:
for x in range(10):
print 'r{0}'.format(x),
Additionally, this approach doesn’t require the second print statement.