1

I am writing with python 2.7

I have the following code:

a = 0
b = 0
while True:
    a += 1
    b += 1
    print str(a)
    print str(b)

The output looks like:

1
1
2
2
3
3
4
....

And want to flush these two lines with stdout.flush(). The code looks like this but it's not working..

import sys

a = 0
b = 0
while True:
    a += 1
    b += 1
    sys.stdout.write(str(a)+"\n")
    sys.stdout.write(str(b)+"\r")
    sys.stdout.flush()

And this produces an output like this:

1   #1
2   #1   ->#2
3          #2   ->#3
4                 #3   ->#4
...

I know this is because \r only jump to the beginning of the 2nd line, and start from the the next prints..

How can I set the cursor to the beginning of 1st line instead of the 2nd line?

So that it will refresh only 2 lines:

n  #1 ->#2  ->#3  ->#4  ->#.....
n  #1 ->#2  ->#3  ->#4  ->#.....

I hope somebody will understand what I mean.

vP3nguin
  • 320
  • 6
  • 18

1 Answers1

9

to go to the upper line from the current one this has to be written on the stdout \x1b[1A

CURSOR_UP_ONE = '\x1b[1A' 

to erase the contents of the line \x1b[2K has to be written on stdout.

ERASE_LINE = '\x1b[2K'

this way you could go to the upper line and overwrite the data there.

data_on_first_line = CURSOR_UP_ONE + ERASE_LINE + "abc\n"
sys.stdout.write(data_on_first_line)

data_on_second_line = "def\r"
sys.stdout.write(data_on_second_line)
sys.stdout.flush()

for more details http://www.termsys.demon.co.uk/vtansi.htm#cursor

and https://stackoverflow.com/a/12586667

Community
  • 1
  • 1
girish946
  • 745
  • 9
  • 24