ideasman42
ideasman42

Reputation: 47968

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

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

Answers (4)

Faraaz Kurawle
Faraaz Kurawle

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 ljustmethod

However \033[K works best.

Reference:

Upvotes: 0

ljden
ljden

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

ideasman42
ideasman42

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

M Palmer
M Palmer

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

Related Questions