Python: How to print on same line, clearing previous text?

Question:

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?

Asked By: ideasman42

||

Answers:

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")
Answered By: M Palmer

Along with r, the ansi-sequence 33[K is needed – erase to end of line.

This code works as expected.

import sys
for t in ['long line', '%']:
    sys.stdout.write('33[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('33[K' + t + 'r') with …

sys.stdout.write('33[K' + t.expandtabs(2) + 'r')

Answered By: ideasman42

If you have been printing without a newline character at the end of your print, you can flush your latest print with:

print('r33[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('33[F', end='')

You can then flush the line as before.

An example usage:

LINE_FLUSH = 'r33[K'
UP_FRONT_LINE = '33[F'
...
print(UP_FRONT_LINE + LINE_FLUSH + msg)
Answered By: ljden
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.