Подтвердить что ты не робот

Python - переписать несколько строк в консоли

Я знаю, что можно последовательно переписать последнюю строку, отображаемую в терминале, с помощью "\ r", но мне трудно понять, есть ли способ вернуться и редактировать предыдущие строки, напечатанные на консоли.

То, что я хотел бы сделать, это перепечатать несколько строк для текстовой RPG, однако друг также задавался вопросом об этом для приложения, которое имело одну строку, посвященную индикатору выполнения, а другое - описание загрузки.

то есть. консоль будет печатать:

Перемещение файла: NameOfFile.txt
Общий прогресс: [########] 40%

а затем обновить соответствующим образом (обеим линиям) по мере запуска программы.

4b9b3361

Ответ 1

В Unix используйте модуль curses.

В Windows есть несколько вариантов:

Простой пример с использованием проклятий (я полный проклятия n00b):

import curses
import time

def report_progress(filename, progress):
    """progress: 0-10"""
    stdscr.addstr(0, 0, "Moving file: {0}".format(filename))
    stdscr.addstr(1, 0, "Total progress: [{1:10}] {0}%".format(progress * 10, "#" * progress))
    stdscr.refresh()

if __name__ == "__main__":
    stdscr = curses.initscr()
    curses.noecho()
    curses.cbreak()

    try:
        for i in range(10):
            report_progress("file_{0}.txt".format(i), i+1)
            time.sleep(0.5)
    finally:
        curses.echo()
        curses.nocbreak()
        curses.endwin()

Ответ 2

В конечном счете, если вы хотите манипулировать экраном, вам нужно использовать базовые библиотеки ОС, которые обычно будут:

  • curses (или базовые управляющие коды терминала, которые отслеживаются базой данных terminfo/termcap) в Linux или OSX
  • API консоли win32 для Windows.

Ответ от @codeape уже дает вам некоторые из многих опций, если вы не против придерживаться одной ОС или с удовольствием устанавливаете сторонние библиотеки в Windows.

Однако, если вы хотите использовать кросс-платформенное решение, которое вы можете просто установить, вы можете использовать asciimatics. В рамках разработки этого пакета мне пришлось решить различия между средами, чтобы предоставить один API, который работает в Linux, OSX и Windows.

Для индикаторов выполнения вы можете использовать объект BarChart, как показано в этой демонстрации, используя этот код.

Ответ 3

Вот модуль Python для Python 2/3, который может просто решить такую ​​ситуацию несколькими строками кода: D

reprint - простой модуль для Python 2/3 для печати и обновления содержимого нескольких строк в терминале

Вы можете просто рассматривать этот экземпляр output как обычный dict или list (зависит от того, какой режим вы используете). Когда вы изменяете это содержимое в экземпляре output, вывод в терминале будет автоматически обновляться: D

Для вашей потребности, вот код:

from reprint import output
import time

if __name__ == "__main__":
    with output(output_type='dict') as output_lines:
        for i in range(10):
            output_lines['Moving file'] = "File_{}".format(i)
            for progress in range(100):
                output_lines['Total Progress'] = "[{done}{padding}] {percent}%".format(
                    done = "#" * int(progress/10),
                    padding = " " * (10 - int(progress/10)),
                    percent = progress
                    )
                time.sleep(0.05)