Печать в ту же строку, а не в новую строку в python


В основном я хочу сделать противоположное тому, что сделал этот парень... хехе.

скрипт Python: каждый раз печатайте новую строку в оболочку, а не обновляйте существующую строку

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

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, которое казалось правильным. Новый код

print percent_complete,"           r",

Percent complete-это просто строка (я абстрагировался в первый раз, теперь я пытаюсь быть буквальным). Результат теперь заключается в том, что он запускает программу, ничего не печатает до тех пор, пока программа не закончится, а затем печатает "100% complete" на одной и только одной строке.

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

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

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

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

9 52

9 ответов:

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

использовать

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

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

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

из python 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)

для меня сработало сочетание ответов Реми и Сириуса:

from __future__ import print_function
import sys

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

для консоли вам понадобится

sys.stdout.flush()

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

это работает для меня, взломал его один раз, чтобы увидеть, если это возможно, но никогда на самом деле не используется в моей программе (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')

Попробуй вот так:

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

(с запятой в конце.)

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 cmd с использованием Python 2.7

никто не упоминал, что в Python 3(.что-то?) вам не нужно sys.stdout.flush(). print('foobar', end='', flush=True) строительство.

на основе Реми ответа на 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)