Reputation: 47968
In Python you can print on the same line using \r
to move back to the start of the line.
This works well for progress bars or increasing precentage counters, eg: Python print on same line
However when printing lines that may decrease in length, this leaves the previous lines text there, eg:
import sys
for t in ['long line', '%']:
sys.stdout.write(t + '\r')
sys.stdout.write('\n')
Leaves the terminal text as: %ong line
.
Whats the best way to write a shorter line after a longer one, when printing to the same line?
Upvotes: 10
Views: 8009
Reputation: 1148
Technically this solution does not clear the output of previous print statement, but is just a workaround to achieve your goal that is to write a shorter line after a longer one without excess characters of previous line.
A shortened version of @M Palmer's answer.
We can just print space
characters to erase the previous output which can be done using ljust
string method.
print('long line', end="\r")
print('%'.ljust(10))
Output:
%
More generalized way of doing this can be by saving the length of the largest string in the program and passing that lenght to ljust
method
However \033[K
works best.
Reference:
Upvotes: 0
Reputation: 392
If you have been printing without a newline character at the end of your print, you can flush your latest print with:
print('\r\033[K', end='')
If you previously printed with a new line, you can use the ANSI escape code to move up one line and to the beginning of the line with:
print('\033[F', end='')
You can then flush the line as before.
An example usage:
LINE_FLUSH = '\r\033[K'
UP_FRONT_LINE = '\033[F'
...
print(UP_FRONT_LINE + LINE_FLUSH + msg)
Upvotes: 3
Reputation: 47968
Along with \r
, the ansi-sequence \033[K
is needed - erase to end of line.
This code works as expected.
import sys
for t in ['long line', '%']:
sys.stdout.write('\033[K' + t + '\r')
sys.stdout.write('\n')
Note, this doesn't work when the string includes tabs, you may want to replace:
sys.stdout.write('\033[K' + t + '\r')
with ...
sys.stdout.write('\033[K' + t.expandtabs(2) + '\r')
Upvotes: 13
Reputation: 181
I think the simplest way to do this is to write spaces over the characters. For this, it'd be a good idea to write as many spaces are needed to cover the last line only. Example:
previousLength = 0
for t in ["long line", "%"]:
print(" " * previousLength, end="\r")
print(t, end="\r")
previousLength = len(t)
print("\n")
Upvotes: 1