2010-08-15 3 views
18

У меня есть сценарий Python, и я хочу, чтобы он отображал все большее число от 0 до 100% в терминале. Я знаю, как печатать числа на терминале, но как я могу их переписать, поэтому 0 превращается в 1, 1 в 2 и так далее до 100?Как переписать вывод в терминал

ответ

23

Печать возврата каретки (\r) без перехода на новую строку сбрасывает курсор в начало строки, делая следующую печать перезаписана, что уже напечатано:

import time 
import sys 
for i in range(100): 
    print i, 
    sys.stdout.flush() 
    time.sleep(1) 
    print "\r", 

Это не очищает линию, так что если вы пытаетесь, скажем, печатать уменьшающиеся числа, используя эти методы, вы увидите оставшийся текст из предыдущих отпечатков. Вы можете обойти это, заполнив свой вывод пробелами или используя некоторые контрольные коды в других ответах.

+3

эта платформа независима? –

+9

@klez: возможно, не для всех терминалов. Он работает на пишущих машинах. Эта платформа достаточно независима для вас? :) –

+2

На двух платформах, находящихся в моем распоряжении (Linux и Windows), он работает. –

5

Этот рецепт here должен оказаться полезным. С помощью этого модуля в дц, следующий код делает то, что вы хотите:

from tc import TerminalController 
from time import sleep 
import sys 

term = TerminalController() 

for i in range(10): 
    sys.stdout.write("%3d" % i) 
    sys.stdout.flush() 
    sleep(2) 
    sys.stdout.write(term.BOL + term.CLEAR_EOL) 

Рецепт использует terminfo, чтобы получить информацию о терминале и работает в Linux и OS X для ряда терминалов. Однако он не работает в Windows. (Спасибо piquadrat для тестирования, согласно комментарию ниже).

Редактировать: рецепт также дает возможности для использования цветов и переписывания части линии. Он также имеет готовый индикатор выполнения текста.

+3

в соответствии с просьбой, я попробовал ваш код на Windows (Windows 7, Python 2.7). Выход «0 1 2 3 4 5 6 7 8 9». –

+0

@piquadrat: Большое спасибо. –

+0

Это работает, но это слишком много. – vy32

0

на основе this answer, но без терминального контроллера:

import time 
import sys 
for i in range(100): 
    sys.stdout.write("Downloading ... %s%%\r" % (i)) 
    sys.stdout.flush() 
    time.sleep(1) 

Испытано на терминале GNOME (Linux) и Windows, консоли.

Совет. Не используйте этот пример в редакторе IDLE.

2

Использование blessings package - очистить экран (прозрачный/ЦБС) и введите:

import sys 
from blessings import Terminal 
from time import sleep # <- boy, does this sound tempting a.t.m. 

term = Terminal() 
for i in range(6): 
    with term.location(term.width - 3, term.height - 3):   
     print('{}'.format(i)) 
    sleep(2) 
    if (i == 3): 
     print('what was I doing, again?') 
print('done') 

Чтобы установить его из Cheeseshop, просто ...

pip install blessings 
Смежные вопросы