Как смоделировать счетчик выполнения в приложении командной строки в Python?

Моя программа Python выполняет ряд операций и выводит некоторые диагностические данные. Я также хотел бы иметь счетчик прогресса следующим образом:

Percentage done: 25% 

где число увеличивается «на месте». Если я использую только строковые операторы, я могу писать отдельные числа, но это загромождает экран. Есть ли способ достичь этого, например, используя некоторый escape-символ для backspace, чтобы очистить номер и написать следующий?

благодаря

Вот пример показа процентного прочтения файла:

 from sys import * import os import time Size=os.stat(argv[1])[6] #file size f=open(argv[1],"r"); READED_BYTES=0 for line in open(argv[1]): #Read every line from the file READED_BYTES+=len(line) done=str(int((float(READED_BYTES)/Size)*100)) stdout.write(" File read percentage: %s%% %s"%(done,"\r")) stdout.flush(); time.sleep(1) 

Бедственное решение:

  import time for i in range(10): print "\r", i, time.sleep(1) 

Трюк – это заявление печати. Возврат каретки («\ r») возвращает курсор в первый столбец в той же строке, не запустив новую строку. Конечная запятая "," говорит print, чтобы не создавать новую строку.

В зависимости от вашего вывода вы можете запрограммировать оператор печати на конечные пробелы, чтобы фрагменты с более длинными предыдущими строками не мешали вашему текущему типу печати. Его, вероятно, лучше всего собрать строку, которая имеет фиксированную длину для любой информации о ходе.

Посмотрите на панель « Анимированный терминал» в Python от Нади Альрамли

вы можете попробовать посмотреть эту библиотеку, которая в основном делает все для вас:

http://code.activestate.com/recipes/473899-progress-meter/

Вот действительно простой класс Progress Bar, который инкапсулирует большую часть того, что вы хотите сделать с индикатором выполнения CLI (без бара).

  class ProgressBar(object): def __init__(self, total=100, stream=sys.stderr): self.total = total self.stream = stream self.last_len = 0 self.curr = 0 def count(self): self.curr += 1 self.print_progress(self.curr) def print_progress(self, value): self.stream.write('\b' * self.last_len) pct = 100 * self.curr / self.total out = '{:.2f}% [{}/{}]'.format(pct, self.curr, self.total) self.last_len = len(out) self.stream.write(out) self.stream.flush() 

Например

 >>> p = ProgressBar(1000) >>> p.print_progress(500) 50% [500/1000]