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.

1 Answer 1

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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.