3
votes

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?

2
Note that some of the answers to stackoverflow.com/questions/3249524 (lower down on the page), cover this question, but the question is in fact different.ideasman42

2 Answers

4
votes

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')

1
votes

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")