要实现如下所示的状态栏:
[========== ] 45%
[================ ] 60%
[==========================] 100%
我想将它打印到stdout,并保持刷新,不打印到另一行。怎么做?
答案 0 :(得分:217)
'\r'
字符(回车)将光标重置为行的开头,并允许您写入以前在该行上的内容。
from time import sleep
import sys
for i in range(21):
sys.stdout.write('\r')
# the exact output you're looking for:
sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
sys.stdout.flush()
sleep(0.25)
我不是百分之百确定这是否可以在所有系统中完全移植,但它至少可以在Linux和OSX上运行。
答案 1 :(得分:117)
有一个Python模块,您可以从名为PyPI的progressbar
获取实现此类功能的Python模块。如果您不介意添加依赖项,那么这是一个很好的解决方案。否则,请使用其中一个答案。
如何使用它的一个简单示例:
import progressbar
from time import sleep
bar = progressbar.ProgressBar(maxval=20, \
widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()])
bar.start()
for i in xrange(20):
bar.update(i+1)
sleep(0.1)
bar.finish()
要安装它,如果您更喜欢pip,可以使用easy_install progressbar
或pip install progressbar
。
答案 2 :(得分:72)
我找到了有用的库tqdm(https://github.com/tqdm/tqdm/,之前是:https://github.com/noamraph/tqdm)。它会自动估计完成时间,并可用作迭代器。
用法:
import tqdm
import time
for i in tqdm.tqdm(range(1000)):
time.sleep(0.01)
# or other long operations
结果:
|####------| 450/1000 45% [elapsed: 00:04 left: 00:05, 99.15 iters/sec]
tqdm
可以包装任何可迭代的。
答案 3 :(得分:21)
您可以使用\r
(carriage return)。演示:
import sys
total = 10000000
point = total / 100
increment = total / 20
for i in xrange(total):
if(i % (5 * point) == 0):
sys.stdout.write("\r[" + "=" * (i / increment) + " " * ((total - i)/ increment) + "]" + str(i / point) + "%")
sys.stdout.flush()
答案 4 :(得分:16)
您可以在此处使用以下代码作为函数:
def drawProgressBar(percent, barLen = 20):
sys.stdout.write("\r")
progress = ""
for i in range(barLen):
if i < int(barLen * percent):
progress += "="
else:
progress += " "
sys.stdout.write("[ %s ] %.2f%%" % (progress, percent * 100))
sys.stdout.flush()
使用.format:
def drawProgressBar(percent, barLen = 20):
# percent float from 0 to 1.
sys.stdout.write("\r")
sys.stdout.write("[{:<{}}] {:.0f}%".format("=" * int(barLen * percent), barLen, percent * 100))
sys.stdout.flush()
答案 5 :(得分:5)
基于上述答案和关于CLI进度条的其他类似问题,我想我得到了所有这些问题的一般共同答案。请在https://stackoverflow.com/a/15860757/2254146
处查看以下是该功能的副本,但已根据您的风格进行了修改:
import time, sys
# update_progress() : Displays or updates a console progress bar
## Accepts a float between 0 and 1. Any int will be converted to a float.
## A value under 0 represents a 'halt'.
## A value at 1 or bigger represents 100%
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()
看起来像
百分比:[====================] 99.0%
答案 6 :(得分:3)
我今天遇到了这个问题,并且在尝试了Mark Rushakoff的解决方案之后
from time import sleep
import sys
for i in range(21):
sys.stdout.write('\r')
# the exact output you're looking for:
sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
sys.stdout.flush()
sleep(0.25)
我可以说这在W7-64上使用python 3.4.3 64位工作正常但仅在本机控制台中。但是,当使用spyder 3.0.0dev的内置控制台时,换行符仍然/再次出现。由于这花了我一些时间来弄清楚,我想在这里报告这个观察结果。
答案 7 :(得分:3)
如果您正在开发命令行界面,我建议您查看click
这是非常好的:
import click
import time
for filename in range(3):
with click.progressbar(range(100), fill_char='=', empty_char=' ') as bar:
for user in bar:
time.sleep(0.01)
您获得的输出:
$ python test.py
[====================================] 100%
[====================================] 100%
[========= ] 27%
答案 8 :(得分:2)
在此处和其他地方的一些答案的基础上,我已经编写了这个简单的函数,它显示了一个进度条和已用/估计的剩余时间。应该适用于大多数基于unix的机器。
import time
import sys
percent = 50.0
start = time.time()
draw_progress_bar(percent, start)
def draw_progress_bar(percent, start, barLen=20):
sys.stdout.write("\r")
progress = ""
for i in range(barLen):
if i < int(barLen * percent):
progress += "="
else:
progress += " "
elapsedTime = time.time() - start;
estimatedRemaining = int(elapsedTime * (1.0/percent) - elapsedTime)
if (percent == 1.0):
sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: Done!\n" %
(progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60))
sys.stdout.flush()
return
else:
sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: %im%02is " %
(progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60,
estimatedRemaining/60, estimatedRemaining%60))
sys.stdout.flush()
return
答案 9 :(得分:2)
这是一个非常简单的方法,可用于任何循环。
#!/usr/bin/python
for i in range(100001):
s = ((i/5000)*'#')+str(i)+(' %')
print ('\r'+s),
答案 10 :(得分:1)
def printProgressBar(value,label):
n_bar = 40 #size of progress bar
max = 100
j= value/max
sys.stdout.write('\r')
bar = '█' * int(n_bar * j)
bar = bar + '-' * int(n_bar * (1-j))
sys.stdout.write(f"{label.ljust(10)} | [{bar:{n_bar}s}] {int(100 * j)}% ")
sys.stdout.flush()
致电:
printProgressBar(30,"IP")
IP | [████████████----------------------------] 30%
答案 11 :(得分:0)
import progressbar
import time
# Function to create
def animated_marker():
widgets = ['Loading: ', progressbar.Bar('=', '[', ']', '-'), progressbar.Percentage()]
bar = progressbar.ProgressBar(max_value=200,widgets=widgets).start()
for i in range(200):
time.sleep(0.1)
bar.update(i+1)
bar.finish()
# Driver's code
animated_marker()
答案 12 :(得分:0)
成为纯python而不进行系统调用:
from time import sleep
for i in range(21):
spaces = " " * (20 - i)
percentage = 5*i
print(f"\r[{'='*i}{spaces}]{percentage}%", flush=True, end="")
sleep(0.25)
答案 13 :(得分:0)
对于Python 3.6,以下对我有用的更新输出 inline :
for current_epoch in range(10):
for current_step) in range(100):
print("Train epoch %s: Step %s" % (current_epoch, current_step), end="\r")
print()
答案 14 :(得分:0)
Per Steven C. Howell对Mark Rushakoff's answer的评论
j = (i + 1) / n
stdout.write('\r')
stdout.write('[%-20s] %d%%' % ('='*int(20*j), 100*j))
stdout.flush()
其中i
是当前项目,n
是项目总数
答案 15 :(得分:0)
这是我使用@ Mark-Rushakoff解决方案所做的事情。自适应调整端子宽度。
from time import sleep
import os
import sys
from math import ceil
l = list(map(int,os.popen('stty size','r').read().split()))
col = l[1]
col = col - 6
for i in range(col):
sys.stdout.write('\r')
getStr = "[%s " % ('='*i)
sys.stdout.write(getStr.ljust(col)+"]"+"%d%%" % (ceil((100/col)*i)))
sys.stdout.flush()
sleep(0.25)
print("")
答案 16 :(得分:0)
进一步改进,使用以下功能:
def printProgressBar(i,max,postText):
n_bar =10 #size of progress bar
j= i/max
sys.stdout.write('\r')
sys.stdout.write(f"[{'=' * int(n_bar * j):{n_bar}s}] {int(100 * j)}% {postText}")
sys.stdout.flush()
通话示例:
total=33
for i in range(total):
printProgressBar(i,total,"blah")
sleep(0.05)
输出:
[================================================ ] 96% blah
答案 17 :(得分:0)
如Mark Rushakoff's solution中所述,您可以输出回车符sys.stdout.write('\r')
,以将光标重置到行首。要推广该解决方案,同时还实现Python 3's f-Strings,则可以使用
from time import sleep
import sys
n_bar = 50
iterable = range(33) # for demo purposes
n_iter = len(iterable)
for i, item in enumerate(iterable):
j = (i + 1) / n_iter
sys.stdout.write('\r')
sys.stdout.write(f"[{'=' * int(n_bar * j):{n_bar}s}] {int(100 * j)}%")
sys.stdout.flush()
sleep(0.05)
# do something with <item> here
答案 18 :(得分:0)
使用@ Mark-Rushakoff答案,我制定了一种更简单的方法,无需调用sys库。它适用于Python3。在Windows中测试过:
showHero
答案 19 :(得分:0)
最简单的仍然是
import sys
total_records = 1000
for i in range (total_records):
sys.stdout.write('\rUpdated record: ' + str(i) + ' of ' + str(total_records))
sys.stdout.flush()
键用于将整数类型转换为字符串。
答案 20 :(得分:0)
尝试PyProg。 PyProg是一个Python的开源库,可以创建超级自定义的进度指示器。杆
目前版本为1.0.2;它托管在Github上,可在PyPI上获得(下面的链接)。它与Python 3&amp; 2,它也可以用于Qt控制台。
它非常易于使用。以下代码:
import pyprog
from time import sleep
# Create Object
prog = pyprog.ProgressBar(" ", " ", total=34, bar_length=26, complete_symbol="=", not_complete_symbol=" ", wrap_bar_prefix=" [", wrap_bar_suffix="] ", progress_explain="", progress_loc=pyprog.ProgressBar.PROGRESS_LOC_END)
# Update Progress Bar
prog.update()
for i in range(34):
# Do something
sleep(0.1)
# Set current status
prog.set_stat(i + 1)
# Update Progress Bar again
prog.update()
# Make the Progress Bar final
prog.end()
会产生你想要的东西(甚至是长度!):
[=========== ] 45%
[=============== ] 60%
[==========================] 100%
有关自定义进度条的更多选项,请转到本网站的Github页面。
我实际上制作了PyProg,因为我需要一个简单但超级可自定义的进度条库。您可以使用以下代码轻松安装它:pip install pyprog
。
PyProg Github:https://github.com/Bill13579/pyprog
PyPI:https://pypi.python.org/pypi/pyprog/