4

我编写了这个简单的函数“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)光标不是从零开始的。

4

1 回答 1

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 会记住前一行的剩余字符,如果你只覆盖它的第一部分。

于 2013-03-28T15:00:10.043 回答