2010-08-05 1 views
43

В принципе, я хочу сделать противоположное тому, что сделал этот парень ... хе-хе.Печать в той же строке, а не новая строка в python

Python Script: Print new line each time to shell rather than update existing line

У меня есть программа, которая говорит мне, как далеко это.

for i in some_list: 
    #do a bunch of stuff. 
    print i/len(some_list)*100," percent complete" 

Так что, если len (some_list) было 50, я бы получил последнюю строку, напечатанную 50 раз. Я хочу напечатать одну строку и продолжить обновление этой строки. Я знаю, что знаю, что это, вероятно, самый лёгкий вопрос, который вы будете читать весь день. Я просто не могу понять, какие четыре слова мне нужно отправить в Google, чтобы получить ответ.

Обновление! Я попробовал предложение mvds, которое SEEMED было правильным. Новый код

print percent_complete,"   \r", 

Процент выполнения это просто строка (я абстрагирования в первый раз, теперь я пытается быть буквальным). Теперь результат состоит в том, что он запускает программу, не печатает «НИЧЕГО» до завершения программы, а затем печатает «100% завершен» на одной и только одной строке.

Без возврата каретки (но с запятой, половиной предложения mvds) он ничего не печатает до конца. А затем отпечатки:

0 percent complete  2 percent complete  3 percent complete  4 percent complete  

И так далее. Итак, теперь новая проблема заключается в том, что с запятой она не печатается, пока программа не будет закончена.

С возвратом каретки и без запятой он ведет себя точно так же, как и ни с одним из них.

+0

Возможно, вы также захотите проверить 'sys.stdout.isatty()', чтобы вы не выплевывали эти вещи, когда не выполнялись в терминале. – mvds

+0

Я запускаю это из терминала ... хорошая мысль. Я уверен, что в какой-то момент мне это понадобится. – chriscauley

+1

фон - это, кстати, то, что на нескольких языках \ n (который мы теперь опускаем) служит неявным сигналом для сброса в stdout. В противном случае многие люди будут смущены. – mvds

ответ

66

Это называется возврат каретки или \r

Использование

print i/len(some_list)*100," percent complete   \r", 

Запятая предотвращает печать от добавления новой строки. (и пробелы будут держать линию в явном виде от предыдущего выхода)

Кроме того, не забудьте закончить с print "", чтобы получить хотя бы завершающую новую строку!

+6

Просто убедитесь, что вы всегда печатаете тот же объем данных (или больше, чем любой предыдущий отпечаток) на линии, иначе вы в конце концов получите рывок в конце. –

+1

+1 действительно хорошая точка, исправит – mvds

+0

Так близко ... Я обновлю вопрос с результатом этого. – chriscauley

0

Попробуй так: (. С запятой в конце)

for i in some_list: 
    #do a bunch of stuff. 
    print i/len(some_list)*100," percent complete", 

+0

Это просто добавляет новый текст в старый (функционально схожий, но уродливый). – chriscauley

2

Это работает для меня, взломал ее один раз, чтобы увидеть, если это возможно, но никогда не использовал в моей программа (GUI так намного лучше):

import time 
f = '%4i %%' 
len_to_clear = len(f)+1 
clear = '\x08'* len_to_clear 
print 'Progress in percent:'+' '*(len_to_clear), 
for i in range(123): 
    print clear+f % (i*100//123), 
    time.sleep(0.4) 
raw_input('\nDone') 
18

С питона 3.x вы можете сделать:

print('bla bla', end='') 

(который также может использоваться в Python 2.6 или 2.7, поставив from __future__ import print_function в верхней части вашего скрипта/модуля)

Python консоли прогрессбар пример:

import time 

# status generator 
def range_with_status(total): 
    """ iterate from 0 to total and show progress in console """ 
    n=0 
    while n<total: 
     done = '#'*(n+1) 
     todo = '-'*(total-n-1) 
     s = '<{0}>'.format(done+todo) 
     if not todo: 
      s+='\n'   
     if n>0: 
      s = '\r'+s 
     print(s, end='') 
     yield n 
     n+=1 

# example for use of status generator 
for i in range_with_status(10): 
    time.sleep(0.1) 
+0

\ r также добавляет новую строку – fccoelho

9

для консоли вам, вероятно, потребуется

sys.stdout.flush() 

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

+0

Терминатор только обновлял строку каждые 30 секунд при использовании print ("...", end = '\ r') для меня, если я не запустил эту команду сразу после печати заявление. благодаря –

8

Для меня, что сработало было комбо Реми и ответы siriusd в:

from __future__ import print_function 
import sys 

print(str, end='\r') 
sys.stdout.flush() 
0
import time 
import sys 


def update_pct(w_str): 
    w_str = str(w_str) 
    sys.stdout.write("\b" * len(w_str)) 
    sys.stdout.write(" " * len(w_str)) 
    sys.stdout.write("\b" * len(w_str)) 
    sys.stdout.write(w_str) 
    sys.stdout.flush() 

for pct in range(0, 101): 
    update_pct("{n}%".format(n=str(pct))) 
    time.sleep(0.1) 

\b переместит местоположение курсора назад на одно место
Итак, мы переместим его обратно до начала строки.
Затем мы записываем пробелы, чтобы очистить текущую строку. Когда мы записываем пробелы, курсор перемещается вперед/вправо на один
Итак, мы должны переместить курсор назад в начале строки, прежде чем мы пишем наши новые данные

Испытано на ЦМД Windows с помощью Python 2.7

0

на основе Remi answer для Python 2.7+ использования этого:

from __future__ import print_function 
import time 

# status generator 
def range_with_status(total): 
    """ iterate from 0 to total and show progress in console """ 
    import sys 
    n = 0 
    while n < total: 
     done = '#' * (n + 1) 
     todo = '-' * (total - n - 1) 
     s = '<{0}>'.format(done + todo) 
     if not todo: 
      s += '\n' 
     if n > 0: 
      s = '\r' + s 
     print(s, end='\r') 
     sys.stdout.flush() 
     yield n 
     n += 1 


# example for use of status generator 
for i in range_with_status(50): 
    time.sleep(0.2)