PyCV
PyCV

Reputation: 325

How to output above the last printed line?

Is there a way in python to print something in the command line above the last line printed? Or, similarly to what I want to achieve, remain the last line intact, that is, not overwrite it.

The goal of this is to let the last line in the command line a status/precentage bar.

Output example:

File 1 processed
(0.1% Completed)

Next refresh:

File 1 processed
File 2 processed
(0.2% Completed)

Next refresh:

File 1 processed
File 2 processed
File 3 processed
(0.3% Completed)

Upvotes: 10

Views: 6728

Answers (2)

mucka
mucka

Reputation: 1335

from time import sleep
erase = '\x1b[1A\x1b[2K'

def download(number):
    print(erase + "File {} processed".format(number))

def completed(percent):
    print("({:1.1}% Completed)".format(percent))

for i in range(1,4):
    download(i)
    completed(i/10)
    sleep(1)

Works in my python 3.4, final output is:

File 1 processed
File 2 processed
File 3 processed
(0.3% Completed)

If you want read more about terminal escape codes see: Wikipedia's ANSI escape codes article.

As requested, example with a space:

from time import sleep
erase = '\x1b[1A\x1b[2K'

def download(number):
    print(erase*2 + "File {} processed".format(number))

def completed(percent):
    print("\n({:1.1}% Completed)".format(percent))

print("\n(0.0% Completed)")
for i in range(1,5):
    download(i)
    completed(i/10)
    sleep(1)

The final output is:

File 1 processed
File 2 processed
File 3 processed
File 4 processed

(0.4% Completed)

Upvotes: 10

Nuageux
Nuageux

Reputation: 1686

Take a look at the \r command. This could do the trick.

for i in range(2):
    print '\rFile %s processed' % i
    print '(0.%s%% Completed)' % i,

Output is:

File 0 processed
File 1 processed
(0.1% Completed)

Upvotes: 2

Related Questions