Как обновить последние две линии в консоли — не затрагиваю другие строки?

Для обновления последних двух линий в консоли без затрагивания других строк, можно использовать следующий подход:

1. Используйте ANSI Escape-символы: ANSI Escape-символы предоставляют возможность контролировать различные аспекты вывода в консоль, включая перемещение курсора на нужную позицию и перезапись текста.

2. Определите текущую позицию курсора: Для этого можно использовать специальный ANSI Escape-символ 33[6n, который возвращает позицию курсора в формате <ESC>[<row>;<column>R. Воспользуйтесь модулем sys в Python, чтобы отправить запрос на позицию курсора и получить ответ.

3. Переместите курсор на нужные позиции: Используйте ANSI Escape-символ 33[<row>;<column>H, чтобы установить позицию курсора в нужном месте. Вычислите новые позиции для обновления последних двух строк в консоли, и переместите курсор на них.

4. Перезапишите текст: Используя ANSI Escape-символ 33[K, очистите содержимое двух последних строк (если они не пусты) и напишите новый текст.

5. Переместите курсор в начало: Используйте ANSI Escape-символ 33[<row>;<column>H, чтобы переместить курсор в начало консоли после обновления текста.

Приведу пример кода, демонстрирующего этот подход:

import sys

# Определение текущей позиции курсора
def get_cursor_position():
    sys.stdout.write("33[6n")
    sys.stdout.flush()
    response = ""
    while True:
        ch = sys.stdin.read(1)
        response += ch
        if ch == "R":
            break
    # Парсинг ответа для получения координат курсора
    cursor_position = response[2:-1].split(";")
    return int(cursor_position[0]), int(cursor_position[1])

# Обновление текста в консоли
def update_console(text):
    # Получение текущей позиции курсора
    cursor_row, cursor_column = get_cursor_position()

    # Перемещение курсора на нужные позиции (обновление последних двух строк)
    sys.stdout.write("33[{}A".format(2))  # Перемещение курсора на 2 строки вверх
    sys.stdout.write("33[K33[1G")  # Очистка содержимого первой строки и перемещение курсора в начало

    # Написание нового текста
    sys.stdout.write(text)

    # Перемещение курсора в начало
    sys.stdout.write("33[{}A".format(cursor_row))  # Перемещение курсора на исходную позицию
    sys.stdout.flush()

# Пример использования
update_console("New text for the last two linesn")

Этот код использует ANSI Escape-символы для обновления последних двух строк в консоли без затрагивания других строк. Поменяйте "New text for the last two lines" на нужный вам текст, который будет отображен на последних двух строках в консоли.