Заменить вывод консоли в Python

Мне интересно, как я могу создать один из этих отличных счетчиков консоли в Python, как в некоторых программах на C / C ++.

У меня есть цикл, делающий вещи, и текущий вывод идет по строкам:

Doing thing 0 Doing thing 1 Doing thing 2 ... 

то, что было бы опрятным, было бы просто обновить последнюю строку;

 X things done. 

Я видел это в нескольких консольных программах, и мне интересно, как и как я буду делать это на Python.

  • Есть ли разница между «== False» и «is not» при проверке пустой строки?
  • Как получить токен доступа пользователя в Python
  • Функция Python возвращает None, непонятно, почему
  • python: печать по горизонтали, а не текущая печать по умолчанию
  • Mercurial Hook - изменить сообщение фиксации фиксации
  • Добавить метки времени в python
  • Python: неверный литерал для int () с базой 10: '808.666666666667'
  • печать stdout в режиме реального времени из подпроцесса
  • 5 Solutions collect form web for “Заменить вывод консоли в Python”

    Простое решение – просто написать "\r" перед строкой и не добавлять новую строку; если строка никогда не становится короче, этого достаточно …

     sys.stdout.write("\rDoing thing %i" % i) sys.stdout.flush() 

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

     def startProgress(title): global progress_x sys.stdout.write(title + ": [" + "-"*40 + "]" + chr(8)*41) sys.stdout.flush() progress_x = 0 def progress(x): global progress_x x = int(x * 40 // 100) sys.stdout.write("#" * (x - progress_x)) sys.stdout.flush() progress_x = x def endProgress(): sys.stdout.write("#" * (40 - progress_x) + "]\n") sys.stdout.flush() 

    Вы вызываете startProgress передавая описание операции, затем progress(x) где x – процент и, наконец, endProgress()

    Более элегантным решением может быть:

     def progressBar(value, endvalue, bar_length=20): percent = float(value) / endvalue arrow = '-' * int(round(percent * bar_length)-1) + '>' spaces = ' ' * (bar_length - len(arrow)) sys.stdout.write("\rPercent: [{0}] {1}%".format(arrow + spaces, int(round(percent * 100)))) sys.stdout.flush() 

    вызовите эту функцию со значением и значением endvalue, результат должен быть

     Percent: [-------------> ] 69% 

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

     def progress(x): out = '%s things done' % x # The output bs = '\b' * 1000 # The backspace print bs, print out, 

    Затем я назвал его в цикле в моей основной функции следующим образом:

     def main(): for x in range(20): progress(x) return 

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

    Если я хорошо понял (не уверен), вы хотите печатать с помощью <CR> а не <LR> ?

    Если это так, возможно, до тех пор, пока консольный терминал это разрешит (он будет ломаться при перенаправлении вывода si в файл).

     from __future__ import print_function print("count x\r", file=sys.stdout, end=" ") 

    Для тех, кто натыкается на эти годы позже (как я и сделал), я немного изменил методы 6502, чтобы позволить индикатору прогресса уменьшаться, а также увеличиваться. Полезно в немногих случаях. Спасибо 6502 за отличный инструмент!

    В основном, единственное различие заключается в том, что вся строка #s и -s записывается каждый раз, когда вызывается прогресс (x), и курсор всегда возвращается в начало строки.

     def startprogress(title): """Creates a progress bar 40 chars long on the console and moves cursor back to beginning with BS character""" global progress_x sys.stdout.write(title + ": [" + "-" * 40 + "]" + chr(8) * 41) sys.stdout.flush() progress_x = 0 def progress(x): """Sets progress bar to a certain percentage x. Progress is given as whole percentage, ie 50% done is given by x = 50""" global progress_x x = int(x * 40 // 100) sys.stdout.write("#" * x + "-" * (40 - x) + "]" + chr(8) * 41) sys.stdout.flush() progress_x = x def endprogress(): """End of progress bar; Write full bar, then move to next line""" sys.stdout.write("#" * 40 + "]\n") sys.stdout.flush() 
    Python - лучший язык программирования в мире.