Как reset курсор в начало той же строки в Python
Большинство вопросов, связанных с этими темами здесь, в SO, выглядит следующим образом:
Как распечатать некоторую информацию на одной строке без введения новая строка
Q1 Q2.
Вместо этого мой вопрос таков:
Я ожидаю увидеть следующий эффект,
>> You have finished 10%
где 10
продолжают расти в одно и то же время. Я знаю, как это сделать на С++, но не могу
найти хорошее решение в python.
Ответы
Ответ 1
import sys, time
for i in xrange(0, 101, 10):
print '\r>> You have finished %d%%' % i,
sys.stdout.flush()
time.sleep(2)
print
\r
- возврат каретки. Вам нужна запятая в конце оператора print
чтобы избежать автоматического перехода на новую строку. Наконец, sys.stdout.flush()
необходим для очистки буфера до стандартного вывода.
Для Python 3 вы можете использовать:
print("\r>> You have finished {}%".format(i), end='')
Ответ 2
Python 3
Вы можете использовать ключевые аргументы для print
:
print('string', end='\r', flush=True)
-
end='\r'
заменяет поведение конца строки по умолчанию на '\r'
-
flush=True
очищает буфер, заставляя напечатанный текст появляться сразу.
Python 2
В 2. 6+ вы можете использовать from __future__ import print_function
в начале скрипта, чтобы включить поведение Python 3. Или используйте старый способ:
print
Python ставит новую строку после каждой команды, если вы не подавляете ее запятой. Итак, команда печати:
print 'You have finished {0}%\r'.format(percentage),
Обратите внимание на запятую в конце.
К сожалению, Python отправляет вывод на терминал только после полной строки. Вышеприведенная строка не является полной строкой, поэтому ее необходимо flush
вручную:
import sys
sys.stdout.flush()
Ответ 3
В Linux (и, вероятно, в Windows) вы можете использовать модуль Curses, как это
import time
import curses
win = curses.initscr()
for i in range(100):
win.clear()
win.addstr("You have finished %d%%"%i)
win.refresh()
time.sleep(.1)
curses.endwin()
В отличие от другой более простой техники, с помощью curses можно рисовать на терминале, как в графической программе, потому что curses обеспечивает перемещение в любую позицию x, y, например, ниже приведен простой скрипт, который обновляет четыре представления.
import time
import curses
curses.initscr()
rows = 10
cols= 30
winlist = []
for r in range(2):
for c in range(2):
win = curses.newwin(rows, cols, r*rows, c*cols)
win.clear()
win.border()
winlist.append(win)
for i in range(100):
for win in winlist:
win.addstr(5,5,"You have finished - %d%%"%i)
win.refresh()
time.sleep(.05)
curses.endwin()
Ответ 4
использование sys.stdout.write()
вместо print работает как в python 2, так и в 3 без каких-либо компромиссов.
Ответ 5
Мне пришлось объединить несколько ответов выше, чтобы заставить его работать на Python 3.7/Windows 10. Пример работает на консоли Spyder:
import sys, time
for i in range(0, 101, 5):
print("\r>> You have finished {}%".format(i), end='')
sys.stdout.flush()
time.sleep(.2)
time.sleep(.2)
просто используется для имитации некоторого трудоемкого кода.