在Python中打印进度条处理

时间:2013-03-28 14:55:01

标签: python printing progress-bar

我写了这个简单的函数“processing_flush”,以便打印一系列点(由索引给出)来测试我的软件是否正在处理我的数据并最终处理速度。 我的数据总大小未知。

    import sys
    import time

    def processing_flush(n, index=5):
        sys.stdout.write("\rProcessing %s" % ((n % index)* "."))
        sys.stdout.flush()

    for n in xrange(20):
        processing_flush(n, index=5)
        time.sleep(1)

我无法解决的问题是第一次打印所有点时(例如:处理....如果索引等于5),光标不会从零开始。

1 个答案:

答案 0 :(得分:6)

在再次覆盖同一行之前,您需要至少清除带有空格的点的位置。

def processing_flush(n, index=5):
    sys.stdout.write("\rProcessing %s" % (index * " "))
    sys.stdout.write("\rProcessing %s" % ((n % index)* "."))
    sys.stdout.flush()

上面的代码可能会导致一些短暂的闪烁。在您的特定情况下,当n % index变为0时清除该行就足够了:

def processing_flush(n, index=5):
    if n % index == 0:
        sys.stdout.write("\rProcessing %s" % (index * " "))
    sys.stdout.write("\rProcessing %s" % ((n % index)* "."))
    sys.stdout.flush()

或者更好的是总是写index-1个字符:

def processing_flush(n, index=5):
    sys.stdout.write("\rProcessing %s%s" % ((n % index)* ".", (index - 1 - (n % index))* " "))
    sys.stdout.flush()

修改1:或者如果您希望光标始终位于最后一个点之后:

def processing_flush(n, index=5):
    sys.stdout.write("\rProcessing %s%s" % ((n % index)* ".", (index - 1 - (n % index))* " "))
    sys.stdout.write("\rProcessing %s" % ((n % index)* "."))
    sys.stdout.flush()

编辑2:或者如果您希望光标始终位于该行的开头:

def processing_flush(n, index=5):
    sys.stdout.write("Processing %s%s\r" % ((n % index)* ".", (index - 1 - (n % index))* " "))
    sys.stdout.flush()

原因是如果你只覆盖它的第一部分,你的shell会记住上一行的剩余字符。