Python - переписать несколько строк в консоли
Я знаю, что можно последовательно переписать последнюю строку, отображаемую в терминале, с помощью "\ r", но мне трудно понять, есть ли способ вернуться и редактировать предыдущие строки, напечатанные на консоли.
То, что я хотел бы сделать, это перепечатать несколько строк для текстовой RPG, однако друг также задавался вопросом об этом для приложения, которое имело одну строку, посвященную индикатору выполнения, а другое - описание загрузки.
то есть. консоль будет печатать:
Перемещение файла: NameOfFile.txt
Общий прогресс: [########] 40%
а затем обновить соответствующим образом (обеим линиям) по мере запуска программы.
Ответы
Ответ 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)