简体   繁体   中英

Is there go up line character? (Opposite of \n)

I would like to overwrite something on a line above in a serial console. Is there a character that allows me to move up?

Most terminals understand ANSI escape codes<\/a> . The relevant codes for this use case:

  • <\/li>
  • <\/li><\/ul>

    Example (Python):

No, not really easily, for that you'd have to use something like the curses library , especially if you want to have more control over cursor placement and do more things programatically.

Here's a link for the Python docs on Programming with Curses , and this short tutorial/example might be of interest too.

I just found this note in the docs in case you are using Windows:

No one has made a Windows port of the curses module. On a Windows platform, try the Console module written by Fredrik Lundh. The Console module provides cursor-addressable text output, plus full support for mouse and keyboard input, and is available from http://effbot.org/zone/console-index.htm .

I believe for C++ there is the NCurses library, the linked page has a section on moving the cursor if you want to poke around with C++. Also there's the NCurses Programming HowTo .

Long time ago I used the curses library with C quite successfully.

Update :

I missed the part about running this on a terminal/serially, for that the ANSI escape sequence, especially for a simple task like yours, will be easiest and I agree with @SvenMarnach solution for this.

for i in range(10):  
    print("Loading" + "." * i) 

    doSomeTimeConsumingProcessing()

    sys.stdout.write("\033[F") # Cursor up one lin

I may be wrong but :

#include <windows.h>


void gotoxy ( int column, int line )
{
  COORD coord;
  coord.X = column;
  coord.Y = line;
  SetConsoleCursorPosition(
    GetStdHandle( STD_OUTPUT_HANDLE ),
    coord
    );
}

in windows standard console.

Carriage return can be used to go to the beginning of line, and ANSI code ESC A<\/code> ( "\\033[A"<\/code> ) can bring you up a line. This works on Linux. It can work on Windows by using the colorama<\/code> package to enable ANSI codes:

import time
import sys
import colorama

colorama.init()

print("Line 1")
time.sleep(1)
print("Line 2")
time.sleep(1)
print("Line 3 (no eol)", end="")
sys.stdout.flush()
time.sleep(1)
print("\rLine 3 the sequel")
time.sleep(1)
print("\033[ALine 3 the second sequel")
time.sleep(1)
print("\033[A\033[A\033[ALine 1 the sequel")
time.sleep(1)
print()  # skip two lines so that lines 2 and 3 don't get overwritten by the next console prompt
print()

A simple way based on @Sven Marnach answer:

print(f'\033[A\rxxx')
  • \033[A : Move cursor one line up.
  • \r : Move the cursor to the beginning of the line.
  • xxx : The string to be printed. {xxx} if it is a variable

If you have some extra characters from the previous line after your string, overwrite them with white space, depending on the length of the previous line. Below I added 10 white spaces.

print(f'\033[A\rxxx{' '* 10}')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM