Подтвердить что ты не робот

Как reset курсор в начало той же строки в Python

Большинство вопросов, связанных с этими темами здесь, в SO, выглядит следующим образом:

Как распечатать некоторую информацию на одной строке без введения новая строка

Q1 Q2.

Вместо этого мой вопрос таков:

Я ожидаю увидеть следующий эффект,

>> You have finished 10%

где 10 продолжают расти в одно и то же время. Я знаю, как это сделать на С++, но не могу найти хорошее решение в python.

4b9b3361

Ответ 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) просто используется для имитации некоторого трудоемкого кода.