如何在不可迭代的代码行上实现进度条?
Posted
技术标签:
【中文标题】如何在不可迭代的代码行上实现进度条?【英文标题】:How can I implement a progress bar on a non-iterable line of code? 【发布时间】:2019-05-02 13:54:54 【问题描述】:我的 Python 脚本中有几行代码需要 20 分钟到几个小时不等,具体取决于所读取文件的大小。我想知道是否可以实现一个进度条来跟踪完成进度。
从我阅读的文档中,我了解到 tqdm 和 progressbar2 经常用于存在 for 循环的情况。
这是我的代码的样子:
gjson2 = rasterstats.zonal_stats(polygons, raster, prefix='xyz_', geojson_out=True,all_touched=False,categorical=True)
代码用于将多边形文件 (.shp) 与光栅文件 (.adf) 相交以提取光栅值。有没有办法可以重写代码以使其可迭代?或者操纵 tqdm 或 progressbar2 在这种情况下工作?
谢谢!
【问题讨论】:
要计算进度,您必须提前知道终点,即以任何单位处理的“总”,以及当前点。没有这个是不可能的。即使文件大小是已知的(不是流)并且它与所需的处理时间(不是给定的)成正比,您也可以通过实验估计总时间,并设置一个计时器(import threading
[? ]) 每次发射这么多子单位的总时间。但是,这更像是一种 hack,因为 CPU 速度因不同机器而异,因此一般情况下它很可能无法正常工作。
【参考方案1】:
我没有太多运气有效地将进度条放入 python 控制台,但如果有帮助,https://geektechstuff.com/2018/12/07/creating-a-progress-bar-python/ 有一些关于 tkinter 窗口进度条的信息。一个例子:
from tkinter import *
from tkinter import ttk
main = Tk()
def foo(progressbar):
progressbar.start()
for _ in range(50):
progressbar.step(10)
###Perform some Function
progressbar.update_idletasks()
progressbar.stop()
progressbar = ttk.Progressbar(main, mode='indeterminate', length=696)
progressbar.grid(column=0, row=4, columnspan=100, rowspan=100, sticky=W, pady=4, padx=3)
foo(progressbar)
main.mainloop()
上面的代码对我有用(python 3x windows 10)。
或者,您可以在 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()
另外:'\r'(回车)字符应该将光标重置到行首。我不能 100% 确定这是否适用于所有系统,但我知道它适用于 Linux 和 OSX:
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)
我希望这会有所帮助!
【讨论】:
我认为问题不在于如何创建进度条本身,而是如何为您无法控制且不提供基于进展。 不太确定,但除非您使用进度条模块,或者以某种方式估算所需时间(这会减慢过程),否则在不知道需要多长时间的情况下可能无法实现将采取;至少使用基本进度条会显示进度。以上是关于如何在不可迭代的代码行上实现进度条?的主要内容,如果未能解决你的问题,请参考以下文章