True
。在执行函数的过程中如何显示进度条?请注意,我需要实时显示进度条,因此无法弄清楚该怎么做。我需要一个
thread
吗?我不知道。现在我在执行函数时不打印任何内容,但是进度条会很不错。另外,从代码的角度来看,我对如何完成此操作也更感兴趣。
#1 楼
有特定的库(例如此处的库),但是也许可以做一些非常简单的事情:import time
import sys
toolbar_width = 40
# setup toolbar
sys.stdout.write("[%s]" % (" " * toolbar_width))
sys.stdout.flush()
sys.stdout.write("\b" * (toolbar_width+1)) # return to start of line, after '['
for i in xrange(toolbar_width):
time.sleep(0.1) # do real work here
# update the bar
sys.stdout.write("-")
sys.stdout.flush()
sys.stdout.write("]\n") # this ends the progress bar
注意:progressbar2是Progressbar的一个分支,尚未在其中维护年。
评论
这并不能扩展很多步骤... pypi.python.org/pypi/progress易于使用
– m13r
15年5月8日在21:55
我尝试了这段代码,并抛出了NameError:未定义名称'xrange'的错误。我是否缺少模块?
–蘑菇人
16年5月18日在1:11
@ GokuMcSpock9733您正在使用哪个版本的Python? Python的2 xrange是Python的3 range。
–quapka
16年5月20日在17:49
这不应该是最佳答案。至少对我来说,另一个答案(使用tqdm)要好得多。
–弗洛里安
17 Mar 20 '17在14:39
Python 3中穷人的进度条:print('■',end ='',flush = True)
–PatrickT
5月7日6:30
#2 楼
使用tqdm(conda install tqdm
或pip install tqdm
),您可以在一秒钟内将进度表添加到循环中:from time import sleep
from tqdm import tqdm
for i in tqdm(range(10)):
sleep(3)
60%|██████ | 6/10 [00:18<00:12, 0.33 it/s]
此外,还有笔记本版本:
from tqdm.notebook import tqdm
for i in tqdm(range(100)):
sleep(3)
您可以使用
tqdm.auto
tqdm.notebook
包含一些辅助函数来执行诸如tqdm.contrib
,enumerate
和map
之类的操作。 zip
中存在并发映射。使用
tqdm.contrib.concurrent
或tqdm.contrib.telegram
从jupyter笔记本计算机断开连接后,您甚至可以将进度发送到手机。评论
这是我发现可用于终端机,qtconsole和笔记本电脑的唯一解决方案
–伊夫林
2015年6月1日在1:17
它可以迭代吗?我很难让它与字符串列表一起使用。
–Josh Usre
16年1月12日在21:47
@JoshUsre是的,它应该与任何可迭代项一起使用,目前我没有看到任何可迭代项。但是,显示ETA(剩余时间)需要迭代器具有__len__属性,否则用户必须向tqdm提供total参数。否则,该酒吧将运作,但没有ETA。
–很棒
16年5月30日在11:23
@gaborous:为什么这不是最受好评的答案?与简单的答案不同,此简单的解决方案在终端和Jupyter笔记本电脑中均有效。
–Ébe Isaac
16 Jun 3'在8:04
要在jupyter笔记本中运行,请从tqdm导入tqdm_notebook作为tqdm。否则不要将其写在一行上。
–雅克·马拉帕德
18-10-24在9:52
#3 楼
上面的建议非常好,但是我认为大多数人只想要一个现成的解决方案,不依赖外部程序包,而是可以重用的。我获得了以上所有方面的优点,并将其与测试用例一起用作函数。
要使用它,只需复制“ def update_progress(progress)”,但不是测试脚本。不要忘记导入sys。每当您需要显示或更新进度条时,都可以调用此函数。
通过直接向控制台发送“ \ r”符号以将光标移回开始位置来起作用。 python中的“ print”不能将上面的符号用于此目的,因此我们需要'sys'
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 = 10 # 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()
# update_progress test script
print "progress : 'hello'"
update_progress("hello")
time.sleep(1)
print "progress : 3"
update_progress(3)
time.sleep(1)
print "progress : [23]"
update_progress([23])
time.sleep(1)
print ""
print "progress : -10"
update_progress(-10)
time.sleep(2)
print ""
print "progress : 10"
update_progress(10)
time.sleep(2)
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(10)
这就是测试脚本的结果所显示的(最后进度条动画):
progress : 'hello'
Percent: [----------] 0% error: progress var must be float
progress : 3
Percent: [##########] 100% Done...
progress : [23]
Percent: [----------] 0% error: progress var must be float
progress : -10
Percent: [----------] 0% Halt...
progress : 10
Percent: [##########] 100% Done...
progress : 0->1
Percent: [##########] 100% Done...
Test completed
评论
动画测试(最后一个测试)应该说在range(101)中而不是100,进度会停止在99%,并且永远不会显示完成。
–尼克·亨里奇(Nick Humrich)
2014年11月17日下午22:47
这是一个很好的答案!两个建议:1)您可以使用print(...,end ='')来代替调用stdout.write()+ stdout.flush()。 2)如果将\ r放在字符串的末尾而不是开头,则它将与其他控制台输出一起播放。
– Timbo
12月11日21:43
#4 楼
这个答案不依赖于外部软件包,我还认为大多数人只想要现成的代码。通过定制,可以使以下代码适合您的需要:条形进度符号'#'
,条形size
,文本prefix
等。import sys
def progressbar(it, prefix="", size=60, file=sys.stdout):
count = len(it)
def show(j):
x = int(size*j/count)
file.write("%s[%s%s] %i/%i\r" % (prefix, "#"*x, "."*(size-x), j, count))
file.flush()
show(0)
for i, item in enumerate(it):
yield item
show(i+1)
file.write("\n")
file.flush()
import time
for i in progressbar(range(15), "Computing: ", 40):
time.sleep(0.1) # any calculation you need
输出:
Computing: [################........................] 4/15
不需要第二个线程。上面的某些解决方案/软件包需要。例如,对于
jupyter notebook
,第二个线程可能是个问题。以任何可迭代的方式工作,意味着可以在
len()
上使用任何东西。一个list
,一个dict
之类的东西,例如['a', 'b', 'c' ... 'g']
与生成器一起使用时,只需用list()包装它即可。例如
for i in progressbar(list(your_generator), "Computing: ", 40):
您还可以通过将文件更改为
sys.stderr
来更改输出,例如评论
我喜欢这种解决方案,生成器将引发以下错误:TypeError:类型“ generator”的对象没有len()
–贾贝尔库
19/12/9在17:35
在这种情况下,@ jabellcu(生成器)必须用list()包装。就像进度条中的我一样(list(your_generator),“ Computing:”,40):
–eusoubrasileiro
19/12/9在18:04
以前应该已经看过此评论,却浪费了时间来使它与Generator一起工作。我必须说转换为列表可能对大型对象没有帮助,因为生成器的位置已丢失。 (就我而言,我正在从PDF中读取页面,并且我不想将所有页面都加载到内存中)。我欣赏为进度条添加库的简单性
–rainversion_3
11月19日12:37
#5 楼
要以有用的方式使用任何进度条框架,以获取实际进度百分比和估算的ETA,您需要能够声明其将要执行的步骤数。因此,您的计算函数在另一个线程中,您可以将其分为多个逻辑步骤吗?您可以修改其代码吗?
您无需以任何方式进行重构或拆分,只需在某些位置放置一些策略性
yield
即可,或者如果它具有for循环,只需一个!这样,您的函数将如下所示:
def compute():
for i in range(1000):
time.sleep(.1) # process items
yield # insert this and you're done!
然后只需安装:
pip install alive-progress
并使用它即可:
from alive_progress import alive_bar
with alive_bar(1000) as bar:
for i in compute():
bar()
要获得
|█████████████▎ | ▅▃▁ 321/1000 [32%] in 8s (40.1/s, eta: 16s)
免责声明:我是alive-progress的作者,但它应该可以很好地解决您的问题。请阅读https://github.com/rsalmei/alive-progress上的文档,以下是其功能的示例:
评论
这确实是我在stackoverflow上看到的最好的。
–糊精
6月30日19:57
这太酷了,我不是典型的仰慕者,但是这个lib很棒。做得好兄弟<3
–制药
8月23日13:36
太好了非常易于使用,非常漂亮。
–西蒙·罗斯(Simon Rose)
8月28日8:46
非常光滑且易于使用。
–杰伊·莫迪(Jay Modi)
10月2日14:41
爱它! jupyter笔记本电脑支持情况如何?
– blupp
12月19日晚上11:55
#6 楼
对于类似的应用程序(跟踪循环中的进度),我只使用了python-progressbar:他们的示例如下所示,
from progressbar import * # just a simple progress bar
widgets = ['Test: ', Percentage(), ' ', Bar(marker='0',left='[',right=']'),
' ', ETA(), ' ', FileTransferSpeed()] #see docs for other options
pbar = ProgressBar(widgets=widgets, maxval=500)
pbar.start()
for i in range(100,500+1,50):
# here do something long at each iteration
pbar.update(i) #this adds a little symbol at each iteration
pbar.finish()
print
评论
为了与Python 3兼容,请尝试progressbar2软件包。上面的代码可以使用它。
– d33tah
18年5月25日在8:11
您真的只使用import *吗?
–eric
19/12/25在23:21
#7 楼
尝试从https://pypi.python.org/pypi/progress获得进展。 from progress.bar import Bar
bar = Bar('Processing', max=20)
for i in range(20):
# Do some work
bar.next()
bar.finish()
结果将是如下所示的条:
Processing |############# | 42/100
评论
刚试过这个。非常易于使用。花了我2分钟(包括pip安装进度)使我的状态栏启动并运行。
– Perelin
17年11月17日在22:36
进度很不错,但是如果其他软件操纵stderr,则失败。抱歉,但我尚未调查确切的问题。
–亚瑟
19年8月30日在14:59
它在我的ubuntu控制台中为每个进度打印一行,例如,如果max = 20,它将打印20行...如何使它仅打印一行?
–L's World
5月28日1:17
#8 楼
在这里搜索等效解决方案后,我根据自己的需求做了一个简单的进度课程。我认为我可以发布它。from __future__ import print_function
import sys
import re
class ProgressBar(object):
DEFAULT = 'Progress: %(bar)s %(percent)3d%%'
FULL = '%(bar)s %(current)d/%(total)d (%(percent)3d%%) %(remaining)d to go'
def __init__(self, total, width=40, fmt=DEFAULT, symbol='=',
output=sys.stderr):
assert len(symbol) == 1
self.total = total
self.width = width
self.symbol = symbol
self.output = output
self.fmt = re.sub(r'(?P<name>%\(.+?\))d',
r'\g<name>%dd' % len(str(total)), fmt)
self.current = 0
def __call__(self):
percent = self.current / float(self.total)
size = int(self.width * percent)
remaining = self.total - self.current
bar = '[' + self.symbol * size + ' ' * (self.width - size) + ']'
args = {
'total': self.total,
'bar': bar,
'current': self.current,
'percent': percent * 100,
'remaining': remaining
}
print('\r' + self.fmt % args, file=self.output, end='')
def done(self):
self.current = self.total
self()
print('', file=self.output)
示例:
from time import sleep
progress = ProgressBar(80, fmt=ProgressBar.FULL)
for x in xrange(progress.total):
progress.current += 1
progress()
sleep(0.1)
progress.done()
将打印以下内容:
[======== ] 17/80 ( 21%) 63 to go
评论
太好了,谢谢你。顺便说一句,您可以在__call__的末尾添加progress.current增量,以进一步限制与主代码中对象的交互。
–npit
17年8月13日在23:25
这段代码简单,简洁,有用!谢谢!
–伊恩·瑞温克尔(Ian Rehwinkel)
19年5月6日上午10:16
#9 楼
您可以使用tqdm:from tqdm import tqdm
with tqdm(total=100, desc="Adding Users", bar_format="{l_bar}{bar} [ time left: {remaining} ]") as pbar:
for i in range(100):
time.sleep(3)
pbar.update(1)
在此示例中,进度条运行5分钟
,它显示为:
Adding Users: 3%|█████▊ [ time left: 04:51 ]
您可以根据需要对其进行更改和自定义。
#10 楼
我喜欢Brian Khuu的回答,因为它简单易用,不需要外部软件包。我做了一些更改,因此在这里添加了我的版本:import sys
import time
def updt(total, progress):
"""
Displays or updates a console progress bar.
Original source: https://stackoverflow.com/a/15860757/1391441
"""
barLength, status = 20, ""
progress = float(progress) / float(total)
if progress >= 1.:
progress, status = 1, "\r\n"
block = int(round(barLength * progress))
text = "\r[{}] {:.0f}% {}".format(
"#" * block + "-" * (barLength - block), round(progress * 100, 0),
status)
sys.stdout.write(text)
sys.stdout.flush()
runs = 300
for run_num in range(runs):
time.sleep(.1)
updt(runs, run_num + 1)
它需要运行的总数(
total
)和到目前为止已处理的运行数( progress
)假设total >= progress
。结果如下所示:[#####---------------] 27%
#11 楼
我真的很喜欢python-progressbar,因为它非常易于使用。在最简单的情况下,它就是:
import progressbar
import time
progress = progressbar.ProgressBar()
for i in progress(range(80)):
time.sleep(0.01)
外观可以定制,并且可以显示估计的剩余时间。例如,使用与上面相同的代码,但使用以下代码:
progress = progressbar.ProgressBar(widgets=[progressbar.Bar('=', '[', ']'), ' ',
progressbar.Percentage(), ' ',
progressbar.ETA()])
#12 楼
使用此库:fish
(GitHub)。用法:
>>> import fish
>>> while churning:
... churn_churn()
... fish.animate()
玩得开心!
评论
这是可能的。您应该向开发人员咨询或留下罚单:github.com/lericson/fish。
–艾蒂安
2011年9月11日下午13:54
#13 楼
如果这是一个循环且迭代次数固定的循环,需要花费大量时间,则可以使用我编写的此函数。循环的每次迭代都会增加进度。其中count是循环的当前迭代,total是您要循环到的值,size(int)是您希望条以10为增量的大小,即(大小1 = 10个字符,大小2 = 20个字符)import sys
def loadingBar(count,total,size):
percent = float(count)/float(total)*100
sys.stdout.write("\r" + str(int(count)).rjust(3,'0')+"/"+str(int(total)).rjust(3,'0') + ' [' + '='*int(percent/10)*size + ' '*(10-int(percent/10))*size + ']')
示例:
for i in range(0,100):
loadingBar(i,100,2)
#do some code
输出:
i = 50
>> 050/100 [========== ]
#14 楼
在Python3中非常简单: import time
import math
def show_progress_bar(bar_length, completed, total):
bar_length_unit_value = (total / bar_length)
completed_bar_part = math.ceil(completed / bar_length_unit_value)
progress = "*" * completed_bar_part
remaining = " " * (bar_length - completed_bar_part)
percent_done = "%.2f" % ((completed / total) * 100)
print(f'[{progress}{remaining}] {percent_done}%', end='\r')
bar_length = 30
total = 100
for i in range(0, total + 1):
show_progress_bar(bar_length, i, total)
time.sleep(0.1)
print('\n')
#15 楼
下面的代码是一个非常通用的解决方案,还具有经过的时间和剩余时间估算。您可以使用任何可迭代的对象。进度条的大小固定为25个字符,但可以使用完整,一半和四分之一字符以1%的步长显示更新。输出如下所示: 18% |████▌ | \ [0:00:01, 0:00:06]
带有示例的代码:
import sys, time
from numpy import linspace
def ProgressBar(iterObj):
def SecToStr(sec):
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
return u'%d:%02d:%02d'%(h, m, s)
L = len(iterObj)
steps = {int(x):y for x,y in zip(linspace(0, L, min(100,L), endpoint=False),
linspace(0, 100, min(100,L), endpoint=False))}
qSteps = ['', u'\u258E', u'\u258C', u'\u258A'] # quarter and half block chars
startT = time.time()
timeStr = ' [0:00:00, -:--:--]'
activity = [' -',' \',' |',' /']
for nn,item in enumerate(iterObj):
if nn in steps:
done = u'\u2588'*int(steps[nn]/4.0)+qSteps[int(steps[nn]%4)]
todo = ' '*(25-len(done))
barStr = u'%4d%% |%s%s|'%(steps[nn], done, todo)
if nn>0:
endT = time.time()
timeStr = ' [%s, %s]'%(SecToStr(endT-startT),
SecToStr((endT-startT)*(L/float(nn)-1)))
sys.stdout.write('\r'+barStr+activity[nn%4]+timeStr); sys.stdout.flush()
yield item
barStr = u'%4d%% |%s|'%(100, u'\u2588'*25)
timeStr = ' [%s, 0:00:00]\n'%(SecToStr(time.time()-startT))
sys.stdout.write('\r'+barStr+timeStr); sys.stdout.flush()
# Example
s = ''
for c in ProgressBar(list('Disassemble and reassemble this string')):
time.sleep(0.2)
s += c
print(s)
建议改进或提出其他意见被赞赏。干杯!
#16 楼
我喜欢此页面。从简单的示例开始,然后转到多线程版本。开箱即用。不需要第三方软件包。
代码将如下所示:
import time
import sys
def do_task():
time.sleep(1)
def example_1(n):
for i in range(n):
do_task()
print '\b.',
sys.stdout.flush()
print ' Done!'
print 'Starting ',
example_1(10)
或者这里是使用线程来运行的示例程序运行时旋转旋转的加载条:
import sys
import time
import threading
class progress_bar_loading(threading.Thread):
def run(self):
global stop
global kill
print 'Loading.... ',
sys.stdout.flush()
i = 0
while stop != True:
if (i%4) == 0:
sys.stdout.write('\b/')
elif (i%4) == 1:
sys.stdout.write('\b-')
elif (i%4) == 2:
sys.stdout.write('\b\')
elif (i%4) == 3:
sys.stdout.write('\b|')
sys.stdout.flush()
time.sleep(0.2)
i+=1
if kill == True:
print '\b\b\b\b ABORT!',
else:
print '\b\b done!',
kill = False
stop = False
p = progress_bar_loading()
p.start()
try:
#anything you want to run.
time.sleep(1)
stop = True
except KeyboardInterrupt or EOFError:
kill = True
stop = True
#17 楼
在jupyter笔记本中运行时,无法正常使用tqdm,因为它会在多行上写入输出。改用它:import time
from tqdm import tqdm_notebook as tqdm
for i in tqdm(range(100))
time.sleep(0.5)
#18 楼
如果您的工作无法分解为可测量的块,则可以在新线程中调用函数并花费时间:import thread
import time
import sys
def work():
time.sleep( 5 )
def locked_call( func, lock ):
lock.acquire()
func()
lock.release()
lock = thread.allocate_lock()
thread.start_new_thread( locked_call, ( work, lock, ) )
# This part is icky...
while( not lock.locked() ):
time.sleep( 0.1 )
while( lock.locked() ):
sys.stdout.write( "*" )
sys.stdout.flush()
time.sleep( 1 )
print "\nWork Done"
您显然可以增加所需的计时精度。
评论
答案中的代码将在哪里测量?
–unseen_rider
17-10-15在16:27
#19 楼
我喜欢Gabriel的答案,但我将其更改为灵活的。您可以将bar长度发送到函数,并以所需的任何长度获取进度条。而且,进度条的长度不能为零或为负。另外,您也可以像Gabriel答案一样使用此功能(请参见示例#2)。import sys
import time
def ProgressBar(Total, Progress, BarLength=20, ProgressIcon="#", BarIcon="-"):
try:
# You can't have a progress bar with zero or negative length.
if BarLength <1:
BarLength = 20
# Use status variable for going to the next line after progress completion.
Status = ""
# Calcuting progress between 0 and 1 for percentage.
Progress = float(Progress) / float(Total)
# Doing this conditions at final progressing.
if Progress >= 1.:
Progress = 1
Status = "\r\n" # Going to the next line
# Calculating how many places should be filled
Block = int(round(BarLength * Progress))
# Show this
Bar = "[{}] {:.0f}% {}".format(ProgressIcon * Block + BarIcon * (BarLength - Block), round(Progress * 100, 0), Status)
return Bar
except:
return "ERROR"
def ShowBar(Bar):
sys.stdout.write(Bar)
sys.stdout.flush()
if __name__ == '__main__':
print("This is a simple progress bar.\n")
# Example #1:
print('Example #1')
Runs = 10
for i in range(Runs + 1):
progressBar = "\rProgress: " + ProgressBar(10, i, Runs)
ShowBar(progressBar)
time.sleep(1)
# Example #2:
print('\nExample #2')
Runs = 10
for i in range(Runs + 1):
progressBar = "\rProgress: " + ProgressBar(10, i, 20, '|', '.')
ShowBar(progressBar)
time.sleep(1)
print('\nDone.')
# Example #2:
Runs = 10
for i in range(Runs + 1):
ProgressBar(10, i)
time.sleep(1)
结果:
这是一个简单的进度条。
示例#1
进度:[### -------] 30%
示例#2
进展:[||||||||||||| ....] 60%
完成。
#20 楼
猜猜我有点晚了,但这对使用当前版本python 3的人应该有用,因为它使用了“ f-strings”,如Python 3.6 PEP 498中所介绍:代码
from numpy import interp
class Progress:
def __init__(self, value, end, title='Downloading',buffer=20):
self.title = title
#when calling in a for loop it doesn't include the last number
self.end = end -1
self.buffer = buffer
self.value = value
self.progress()
def progress(self):
maped = int(interp(self.value, [0, self.end], [0, self.buffer]))
print(f'{self.title}: [{"#"*maped}{"-"*(self.buffer - maped)}]{self.value}/{self.end} {((self.value/self.end)*100):.2f}%', end='\r')
示例
#some loop that does perfroms a task
for x in range(21) #set to 21 to include until 20
Progress(x, 21)
输出
Downloading: [########------------] 8/20 40.00%
#21 楼
我使用format()
方法制作了一个负载条。这是我的解决方案:import time
loadbarwidth = 23
for i in range(1, loadbarwidth + 1):
time.sleep(0.1)
strbarwidth = '[{}{}] - {}\r'.format(
(i * '#'),
((loadbarwidth - i) * '-'),
(('{:0.2f}'.format(((i) * (100/loadbarwidth))) + '%'))
)
print(strbarwidth ,end = '')
print()
输出:
[#######################] - 100.00%
#22 楼
这是一个简短的解决方案,可以以编程方式构建加载栏(您必须决定要加载多长时间)。import time
n = 33 # or however many loading slots you want to have
load = 0.01 # artificial loading time!
loading = '.' * n # for strings, * is the repeat operator
for i in range(n+1):
# this loop replaces each dot with a hash!
print('\r%s Loading at %3d percent!' % (loading, i*100/n), end='')
loading = loading[:i] + '#' + loading[i+1:]
time.sleep(load)
#23 楼
尝试PyProg。 PyProg是Python的开放源代码库,用于创建超级可自定义的进度指示器和进度条。当前版本为1.0.2;它托管在Github上,可在PyPI上使用(下面的链接)。它与Python 3&2兼容,还可以与Qt Console一起使用。
它非常易于使用。以下代码:
import pyprog
from time import sleep
# Create Object
prog = pyprog.ProgressBar(" ", "", 34)
# 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()
将产生:
Initial State:
Progress: 0% --------------------------------------------------
When half done:
Progress: 50% #########################-------------------------
Final State:
Progress: 100% ##################################################
我实际上制作了PyProg,因为我需要一个简单的但是超级可定制的进度条库。您可以使用以下命令轻松安装它:
pip install pyprog
。PyProg Github:https://github.com/Bill13579/pyprog
PyPI:https://pypi.python.org/pypi/pyprog /
#24 楼
您也可以使用启发。主要优点是您可以同时登录,而不会覆盖进度条。import time
import enlighten
manager = enlighten.Manager()
pbar = manager.counter(total=100)
for num in range(1, 101):
time.sleep(0.05)
print('Step %d complete' % num)
pbar.update()
它还可以处理多个进度条。
import time
import enlighten
manager = enlighten.Manager()
odds = manager.counter(total=50)
evens = manager.counter(total=50)
for num in range(1, 101):
time.sleep(0.05)
if num % 2:
odds.update()
else:
evens.update()
#25 楼
使用进度库!pip install progress
这里是我编写的一个自定义子类,用于将ETA /经过时间格式化为更好的可读格式:
import datetime
from progress.bar import IncrementalBar
class ProgressBar(IncrementalBar):
'''
My custom progress bar that:
- Show %, count, elapsed, eta
- Time is shown in H:M:S format
'''
message = 'Progress'
suffix = '%(percent).1f%% (%(index)d/%(max)d) -- %(elapsed_min)s (eta: %(eta_min)s)'
def formatTime(self, seconds):
return str(datetime.timedelta(seconds=seconds))
@property
def elapsed_min(self):
return self.formatTime(self.elapsed)
@property
def eta_min(self):
return self.formatTime(self.eta)
if __name__=='__main__':
counter = 120
bar = ProgressBar('Processing', max=counter)
for i in range(counter):
bar.next()
time.sleep(1)
bar.finish()
#26 楼
这是我的简单解决方案:import time
def progress(_cur, _max):
p = round(100*_cur/_max)
b = f"Progress: {p}% - ["+"."*int(p/5)+" "*(20-int(p/5))+"]"
print(b, end="\r")
# USAGE:
for i in range(0,101):
time.sleep(0.1)
progress(i,100)
print("..."*5, end="\r")
print("Done")
#27 楼
一个非常简单的方法:def progbar(count: int) -> None:
for i in range(count):
print(f"[{i*'#'}{(count-1-i)*' '}] - {i+1}/{count}", end="\r")
yield i
print('\n')
和用法:
from time import sleep
for i in progbar(10):
sleep(0.2) #whatever task you need to do
#28 楼
您应该将进度条链接到手头的任务(以便它衡量进度:D)。例如,如果您正在通过FTP传输文件,则可以告诉ftplib抓取一定大小的缓冲区,比方说128K,然后将128k代表的文件大小的任何百分比添加到进度栏中。如果您使用的是CLI,并且进度条的长度为20个字符,那么当文件的1/20传输完后,您将添加一个字符。评论
就我而言,我使用的是API,它不提供获取特定块的功能。谢谢你的想法,这很好。
–user225312
2010年7月1日在19:17
#29 楼
@Massagran:它在我的程序中效果很好。此外,我们需要添加一个计数器来指示循环时间。此计数器充当方法update
的参数。例如,读取测试文件的所有行并将它们放在某些东西上。假设函数dosth()
与变量i
无关。lines = open(sys.argv[1]).readlines()
i = 0
widgets=[Percentage(), Bar()]
pbar = ProgressBar(widgets=widgets,maxval=len(lines)).start()
pbar.start()
for line in lines:<pre>
dosth();
i += 1
pbar.update(i)</pre>
pbar.finish()
变量
i
通过方法pbar
控制
update
的状态。#30 楼
jelde015(当然要归功于他)的一些通用答案,用于手动更新加载条的方法是:
import sys
from math import *
def loadingBar(i, N, size):
percent = float(i) / float(N)
sys.stdout.write("\r"
+ str(int(i)).rjust(3, '0')
+"/"
+str(int(N)).rjust(3, '0')
+ ' ['
+ '='*ceil(percent*size)
+ ' '*floor((1-percent)*size)
+ ']')
并调用它的产生者:
loadingBar(7, 220, 40)
将得到:
007/220 [= ]
只要用当前的
i
随时调用它即可值。将
size
设置为条形的字符数
评论
您仅使用GUI工具箱还是CLI?CLI。但是我可以使用第三方库,这没有问题。使用GUI可以做到这一点,但是我对CLI部分很感兴趣。
控制台中的文本进度栏可能重复。请注意,虽然此问题是三天前发布的,但链接的问题却更常见。
这是在Jupyter笔记本中的解决方案:mikulskibartosz.name/…
我发布了一种新型的进度条,除了非常酷的动画外,您还可以打印,查看吞吐量和eta甚至暂停它!请看一下:github.com/rsalmei/alive-progress!alive-progress