2013-03-28 3 views
4

Я написал эту простую функцию «processing_flush», чтобы напечатать последовательность точек (заданную индексом), чтобы проверить, обрабатывает ли мое программное обеспечение мои данные и, в конечном итоге, скорость. Общий размер моих данных неизвестен.распечатать обработку выполнения в Python

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) курсор не начинается с нуля.

ответ

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

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

Edit 2: Или, если вы предпочитаете, чтобы курсор всегда в начале строки:

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

Причина заключается в том, что ваша оболочка запоминает оставшиеся символы предыдущей строки, если вы перезаписать только первую часть.

+0

Ничего себе это было так просто !!. Спасибо, Йоханнес, я потратил несколько часов на поиски в Google, чтобы найти решение !!! –

+0

Johannes в командной строке окна выглядит лучше второго решения (визуально). С 3) решением в конце всегда идет указатель под подсказкой подсказки. –

+2

@Gianni: Combine 3 и 2: Скопируйте вторую строку из решения 2 в решение 3 перед 'sys.stdout.flush()'. –

Смежные вопросы