本文讨论Python下如何创建一个文本格式的进度条,就像pip下载时的进度条一样。

微实践 - 文本进度条




Python 动态文本进度条 用python写文本进度条_进度条


当计算机执行一个耗时较长的任务时,通常需要显示一个进度条给操作者,便于操作者评估执行进展并缓解其焦虑。本小节讨论如何在文本控制台上通过print()函数显示进度条。

当使用print()函数向系统标准输出输出文本时,总是逐行递增的。如果不特定说明,每个print()函数总是会在输出的末尾补充输出一个换行符"n"。通过指定print的end参数为换行符之外的其它值,可以避免print()函数的自动换行。


#printend.py


执行结果:


我还记得几位唐朝诗人: 李白,杜甫,白居易,孟浩然,


要保持文本进度条在多次刷新时不换行, 我们还得借用另外一个转义符:"r"。这个转义符将使得控制台输出指针回到当前行的行首。


print


执行结果:


123defghijklmn


上述执行结果证明,在输出了"abcdefghijklmn"之后,"r"的输出导致控制台输出指针回到了行首,"123"的输出覆盖了abc。

借助于转义符"r",我们设计了下述文本进度条显示函数。


#ProgressBar.py


代码说明

  • percent参数取值范围0-1,表示百分比进度;prefix表示进度条前方的前缀文本。
  • 只有当percent - progressBefore大于等于千分之一时才会刷新进度条,这样做可以避免进度条不必要的频繁刷新。
  • 进度条的黑色部分是由多个字符█串起来形成的,而█与 - 的个数则根据percent计算而得,两者的个数之和为30。
  • print()一开始就输出了一个"r",让输出光标回到行首,end=''则指定print的结尾为空,不要输出默认的'n'。

由于"r"转义符的应用,每次进度条刷新,输出都会从行首开始,而且输出完成后,end=''参数避免了自动换行。所以,虽然我们多次通过print()函数输出进度,但总是显示在同一行。

读者可能会对代码if __name__ == "__main__"的作用感到疑惑,这行代码用于包裹模块内的测试用代码,具体细节在第14章讨论。