本文讨论Python下如何创建一个文本格式的进度条,就像pip下载时的进度条一样。
版权声明
本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。
本文不可以以纸质出版为目的进行改编、摘抄。
微实践 - 文本进度条
当计算机执行一个耗时较长的任务时,通常需要显示一个进度条给操作者,便于操作者评估执行进展并缓解其焦虑。本小节讨论如何在文本控制台上通过print()函数显示进度条。
当使用print()函数向系统标准输出输出文本时,总是逐行递增的。如果不特定说明,每个print()函数总是会在输出的末尾补充输出一个换行符”\n”。通过指定print的end参数为换行符之外的其它值,可以避免print()函数的自动换行。
1 | #printend.py |
执行结果:
1 | 我还记得几位唐朝诗人: 李白,杜甫,白居易,孟浩然, |
要保持文本进度条在多次刷新时不换行, 我们还得借用另外一个转义符:”\r”。这个转义符将使得控制台输出指针回到当前行的行首。
1 | print("abcdefghijklmn\r123") |
执行结果:
1 | 123defghijklmn |
上述执行结果证明,在输出了”abcdefghijklmn”之后,”\r”的输出导致控制台输出指针回到了行首,”123”的输出覆盖了abc。
借助于转义符”\r”,我们设计了下述文本进度条显示函数。
1 | #ProgressBar.py |
代码说明 |
---|
- percent参数取值范围0-1,表示百分比进度;prefix表示进度条前方的前缀文本。 - 只有当percent - progressBefore大于等于千分之一时才会刷新进度条,这样做可以避免进度条不必要的频繁刷新。 - 进度条的黑色部分是由多个字符█串起来形成的,而█与 - 的个数则根据percent计算而得,两者的个数之和为30。 - print()一开始就输出了一个”\r”,让输出光标回到行首,end=’’则指定print的结尾为空,不要输出默认的’\n’。 |
由于”\r”转义符的应用,每次进度条刷新,输出都会从行首开始,而且输出完成后,end=’’参数避免了自动换行。所以,虽然我们多次通过print()函数输出进度,但总是显示在同一行。
读者可能会对代码if __name__ == “__main__“的作用感到疑惑,这行代码用于包裹模块内的测试用代码,具体细节在第14章讨论。
本文内容节选自作者编著的《Python编程基础及应用》(高等教育出版社)一书。
免费随书B站MOOC: