Python来打印出状态栏和百分比


Answers

'\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)

我不能100%确定它是否可以在所有系统中完全移植,但它至少可以在Linux和OSX上运行。

Question

要实现如下的状态栏:

[==========                ]  45%
[================          ]  60%
[==========================] 100%

我希望将其打印到标准输出,并不断刷新它,而不是打印到另一行。 这个怎么做?




根据上面的回答和其他有关CLI进度条的类似问题,我想我对所有人都有一个普遍的答案。 检查它在https://.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%




您可以使用\r回车 )。 演示:

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()



今天,我尝试了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)

我可以说这对于Python 3.4.3 64位版本在W7-64上工作正常,但只能在本地控制台中使用。 但是,使用spyder 3.0.0dev的内置控制台时,换行符仍然存在/再次出现。 由于这花了我一些时间才弄清楚,我想在这里报告这个观察。




这是一个相当简单的方法,可以用于任何循环。

#!/usr/bin/python
for i in range(100001):
    s =  ((i/5000)*'#')+str(i)+(' %')
    print ('\r'+s),



Related



Tags

python python