Печать в ту же строку, а не в новую строку в 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 ответов:
Это называется возврат каретки, или
\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)