Панель прогресса в консоли Python в Windows
В дополнение к некоторым другим ссылкам я прочитал две ссылки, и я попробовал больше всех примеров и предложений, но в моем выводе индикатор выполнения не обновляется, а новый показывает, либо конец той же строки, либо поочередно на новой строке. Что мне здесь не хватает, может кто-нибудь мне посоветует.
Панель выполнения Python
Строка прогресса текста в консоли
Для удобства я воспроизвожу некоторые из кодов (из примеров выше потоков), которые я пробовал, и их результаты. Я неправильно понял, что он обновит ту же строку или что мне не хватает. Ценю вашу помощь. Я использую Python 3.4 в Windows 7 и получаю вывод на консоли (без GUI).
Пример 1:
import progressbar
import time, sys
progress = progressbar.ProgressBar()
for i in progress(range(80)):
time.sleep(0.01)
Выход 1:
>>>
0% | |
1% | |
2% |# |
3% |## |
5% |### |
6% |#### |
7% |##### |
8% |###### |
10% |####### |
11% |######## |
12% |######### |
13% |######### |
15% |########## |
16% |########### |
17% |############ |
18% |############# |
20% |############## |
21% |############### |
22% |################ |
23% |################# |
25% |################## |
26% |################## |
27% |################### |
28% |#################### |
30% |##################### |
31% |###################### |
32% |####################### |
33% |######################## |
35% |######################### |
36% |########################## |
37% |########################### |
38% |########################### |
40% |############################ |
41% |############################# |
42% |############################## |
43% |############################### |
45% |################################ |
46% |################################# |
47% |################################## |
48% |################################### |
50% |#################################### |
51% |#################################### |
52% |##################################### |
53% |###################################### |
55% |####################################### |
56% |######################################## |
57% |######################################### |
58% |########################################## |
60% |########################################### |
61% |############################################ |
62% |############################################# |
63% |############################################# |
65% |############################################## |
66% |############################################### |
67% |################################################ |
68% |################################################# |
70% |################################################## |
71% |################################################### |
72% |#################################################### |
73% |##################################################### |
75% |###################################################### |
76% |###################################################### |
77% |####################################################### |
78% |######################################################## |
80% |######################################################### |
81% |########################################################## |
82% |########################################################### |
83% |############################################################ |
85% |############################################################# |
86% |############################################################## |
87% |############################################################### |
88% |############################################################### |
90% |################################################################ |
91% |################################################################# |
92% |################################################################## |
93% |################################################################### |
95% |#################################################################### |
96% |##################################################################### |
97% |###################################################################### |
98% |####################################################################### |
100% |########################################################################|
Пример 2:
for i in range(0, 101, 10):
sys.stdout.write('\r>> You have finished %3d%%\r' % i)
sys.stdout.flush()
sys.stdout.flush()
time.sleep(1)
print
Выход 2:
Вы закончили 0% → Вы закончили 10% → Вы закончили 20% → Вы закончили 30% → Вы закончили 40% → Вы закончили 50% → Вы закончили 60% → Вы закончили 70% → Вы закончили 80% → Вы закончили 90% → Вы закончили 100%
Пример 3:
def update_progress(progress):
barLength = 20 # Modify this to change the length of the progress bar
status = ""
if isinstance(progress, int):
progress = float(progress)
if not isinstance(progress, float):
progress = 0
status = "error: progress var must be float\r\n"
if progress < 0:
progress = 0
status = "Halt...\r\n"
if progress >= 1:
progress = 1
status = "Done...\r\n"
block = int(round(barLength*progress))
text = "\rPercent: [{0}] {1}% {2}".format( "="*block + " "*(barLength-block), progress*100, status)
sys.stdout.write(text)
sys.stdout.flush()
print("")
print("progress : 0->1")
for i in range(101):
time.sleep(0.1)
update_progress(i/100.0)
print("")
print("Test completed")
time.sleep(1)
Выход 3:
>>>
progress : 0->1
Percent: [ ] 0.0%
Percent: [ ] 1.0%
Percent: [ ] 2.0%
Percent: [= ] 3.0%
Percent: [= ] 4.0%
Percent: [= ] 5.0%
Percent: [= ] 6.0%
Percent: [= ] 7.000000000000001%
Percent: [== ] 8.0%
Percent: [== ] 9.0%
Percent: [== ] 10.0%
Percent: [== ] 11.0%
Percent: [== ] 12.0%
Percent: [=== ] 13.0%
Percent: [=== ] 14.000000000000002%
Percent: [=== ] 15.0%
Percent: [=== ] 16.0%
Percent: [=== ] 17.0%
Percent: [==== ] 18.0%
Percent: [==== ] 19.0%
Percent: [==== ] 20.0%
Percent: [==== ] 21.0%
Percent: [==== ] 22.0%
Percent: [===== ] 23.0%
Percent: [===== ] 24.0%
Percent: [===== ] 25.0%
Percent: [===== ] 26.0%
Percent: [===== ] 27.0%
Percent: [====== ] 28.000000000000004%
Percent: [====== ] 28.999999999999996%
Percent: [====== ] 30.0%
Percent: [====== ] 31.0%
Percent: [====== ] 32.0%
Percent: [======= ] 33.0%
Percent: [======= ] 34.0%
Percent: [======= ] 35.0%
Percent: [======= ] 36.0%
Percent: [======= ] 37.0%
Percent: [======== ] 38.0%
Percent: [======== ] 39.0%
Percent: [======== ] 40.0%
Percent: [======== ] 41.0%
Percent: [======== ] 42.0%
Percent: [========= ] 43.0%
Percent: [========= ] 44.0%
Percent: [========= ] 45.0%
Percent: [========= ] 46.0%
Percent: [========= ] 47.0%
Percent: [========== ] 48.0%
Percent: [========== ] 49.0%
Percent: [========== ] 50.0%
Percent: [========== ] 51.0%
Percent: [========== ] 52.0%
Percent: [=========== ] 53.0%
Percent: [=========== ] 54.0%
Percent: [=========== ] 55.00000000000001%
Percent: [=========== ] 56.00000000000001%
Percent: [=========== ] 56.99999999999999%
Percent: [============ ] 57.99999999999999%
Percent: [============ ] 59.0%
Percent: [============ ] 60.0%
Percent: [============ ] 61.0%
Percent: [============ ] 62.0%
Percent: [============= ] 63.0%
Percent: [============= ] 64.0%
Percent: [============= ] 65.0%
Percent: [============= ] 66.0%
Percent: [============= ] 67.0%
Percent: [============== ] 68.0%
Percent: [============== ] 69.0%
Percent: [============== ] 70.0%
Percent: [============== ] 71.0%
Percent: [============== ] 72.0%
Percent: [=============== ] 73.0%
Percent: [=============== ] 74.0%
Percent: [=============== ] 75.0%
Percent: [=============== ] 76.0%
Percent: [=============== ] 77.0%
Percent: [================ ] 78.0%
Percent: [================ ] 79.0%
Percent: [================ ] 80.0%
Percent: [================ ] 81.0%
Percent: [================ ] 82.0%
Percent: [================= ] 83.0%
Percent: [================= ] 84.0%
Percent: [================= ] 85.0%
Percent: [================= ] 86.0%
Percent: [================= ] 87.0%
Percent: [================== ] 88.0%
Percent: [================== ] 89.0%
Percent: [================== ] 90.0%
Percent: [================== ] 91.0%
Percent: [================== ] 92.0%
Percent: [=================== ] 93.0%
Percent: [=================== ] 94.0%
Percent: [=================== ] 95.0%
Percent: [=================== ] 96.0%
Percent: [=================== ] 97.0%
Percent: [====================] 98.0%
Percent: [====================] 99.0%
Percent: [====================] 100% Done...
Test completed
>>>
Изменить: вы можете видеть, что печать на той же строке происходит, но она добавляется в конце последней печати, а не перезаписывается, что является желаемым эффектом. Спасибо!
Ответы
Ответ 1
>>> import time
>>> for i in range(0, 101, 10):
... print('\rYou have finished %3d%%' % i, end='', flush=True)
... time.sleep(1)
... else:
... print()
...
You have finished 100%
>>>
работает для меня с Python 3.4.3 на win32...
Idle не корректно отображает возврат каретки.
Посмотрите python напечатать одну строку с тем же пространством. "сделано, моя ошибка, я использовал IDLE" или Внедрение backspace в Python 3.3.2 Shell с использованием Idle.
Idle больше похож на текстовый редактор Python и никакой реальной консоли... поэтому вы не можете интерпретировать управляющий символ и печатать его должным образом в одно и то же время...
>>> print("asd\rfgh")
asdfgh
Ответ 2
Вот класс, который я использую в своих приложениях. Работает на Windows 7 для меня.
Проверьте, изменился ли процент, чтобы не перепечатывать на каждой итерации, print() - тяжелая операция
class ProgressBar:
"""
Create command-line-style ProgressBar
"""
def __init__(self, total, prefix='', suffix='', length=100, fill='*'):
"""
Init ProgressBar
Start position is always 0, end position is total.
Usage example:
progress_bar = ProgressBar(l, prefix='Progress:', suffix='Complete', length=50)
while some():
progress_bar.iterate(i + 1)
:param total: Required, total iterations (Int)
:param prefix: Optional, prefix string (Str)
:param suffix: Optional, suffix string (Str)
:param length: Optional, character length of bar (Int)
:param fill: Optional, bar fill character (Str)
"""
self.counter = 0
self.prev_counter = 0
self.total = total
self.percent_size = total/100
self.prefix = prefix
self.suffix = suffix
self.length = length
self.fill = fill
def iterate(self, iteration):
"""
Call in a loop to create terminal progress bar
@param: iteration: Required, current iteration (Int)
"""
self.prev_counter = int(iteration/self.percent_size)
filled_length = int((self.prev_counter/100) * self.length)
bar = self.fill * filled_length + '-' * (self.length - filled_length)
if self.prev_counter != self.counter:
print('\r%s |%s| %s%% %s' % (self.prefix, bar, self.prev_counter, self.suffix), end='\r')
self.counter = self.prev_counter
# Print New Line on Complete
if iteration == self.total:
print()