Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 18, 2012 14:45:53

chet
От:
Зарегистрирован: 2012-01-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

Просто стало интересно, можно ли так сделать?
Например, хочу вывести на экран ход выполнения проги в процентах.
То есть можно ли перезаписать print определенной переменной в предыдущей итерации?



Офлайн

#2 Апрель 18, 2012 15:23:45

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

>>> import sys
>>> for i in range(100000):
...     sys.stdout.write('\r%s' % i)
...     sys.stdout.flush()

ключевой момент - ‘\r’



Отредактировано Chern (Апрель 18, 2012 15:25:49)

Офлайн

#3 Апрель 18, 2012 15:25:10

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

думаю, этого достаточно будет:

>>> print '123\b\baa'
1aa

Офлайн

#4 Апрель 18, 2012 15:40:50

chet
От:
Зарегистрирован: 2012-01-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

Спасибо Chern
Я уже нашел в книжке именно этот способ под названием “индикатор выполнения процесса”!
beelze этот способ я попробовал, но перезаписи нет!



Офлайн

#5 Апрель 18, 2012 16:25:31

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

>этот способ я попробовал, но перезаписи нет!
и под win и под linux это работает. а что значит «нет перезаписи»? print ‘123\b\baa’ выдает не «1aa» а «123aa»? Смысл \b (backspace) в том, что иногда неудобно всю строку перепечатывать - логика вывода «заголовка» и собственно перезаписываемой части может быть разнесена, поэтому стирается (нужным к-вом \b) только то, что было ранее выведено в рамках «перезаписываемости». Ну и конечно, IRL надо, как указал Chern, использовать именно sys.stdout.write() и .flush() - я иллюстрировал только использование \b, без «готового» кода

Офлайн

#6 Апрель 18, 2012 16:51:40

chet
От:
Зарегистрирован: 2012-01-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

beelze выдает “1аа” все нормально. Только мне надо выводить изменяемую переменную в цикле.
Нет перезаписи - это значит, что по Вашему варианту выводится результат в столбик с каждой итерацией, а мне нужен вывод результата текущей итерации!
то есть не так:

0%
1%
2%
и т.д.
В примере с процентом выполнения проги - это текущий процент, а остальных процентов на экране не должно быть!



Офлайн

#7 Апрель 18, 2012 17:31:37

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

chet
В примере с процентом выполнения проги - это текущий процент, а остальных процентов на экране не должно быть!

Так покажите же как Вы это делаете?

Держите код для размышления
import sys
from time import sleep
for i in range(100):
    sys.stdout.write('%2s%%' % i) 
    sys.stdout.flush()
    sleep(1)
    sys.stdout.write('\b' * 3)



Отредактировано cutwater (Апрель 18, 2012 17:38:52)

Офлайн

#8 Апрель 18, 2012 17:37:15

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

chet, вопрос был про перезапись, так? вот я и предоставил пример собственно перезаписи, а не «готового» кода. Остальное Chern детально пояснил, а я детально пояснил принципиальную разницу. Нужно же принцип понимать а не просто куски кода копипастить.

Отредактировано beelze (Апрель 18, 2012 17:39:08)

Офлайн

#9 Апрель 18, 2012 18:10:01

chet
От:
Зарегистрирован: 2012-01-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

cutwater смотрите сообщение Chern. Повтор.

Так покажите же как Вы это делаете?
А такие вопросы возникают, когда не читаете предыдущие сообщения и сразу на людей кидаться)))


beelze так я и хочу принцип понять! И я уже понял. С помощью print нельзя добиться того, что я хочу. А Вы не поняли мою постановку вопроса! Повторю: я хотел, чтобы на экран cmd выводилось сообщение,например, при наступлении какого-нибудь условия или выполнения операции в цикле, или через какое-то кол-во времени старое выведенное сообщение стиралось, а новое выводилось на экран!
beelze а слово перезапись в своем вопросе я использовал по аналогии с записью в файл в режиме “w”, когда собственно и происходит перезапись файла, если он существует! И хотел узнать, есть ли подобный способ вывода в cmd!
И первый же ответ Chern меня удовлетворил!
Кому что еще не понятно?





Отредактировано chet (Апрель 18, 2012 18:18:07)

Офлайн

#10 Апрель 18, 2012 18:23:17

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Перезапись вывода в командную строку

>С помощью print нельзя добиться того, что я хочу.
а при чем тут собственно print? в большинстве случаев print x и делает что-то вроде sys.stdout.write(str(x)+'\n'). просто сравните сколько набирать в одном случае и сколько во втором, а иллюстративности ничуть не добавилось. Принцип заключается в выводе управляющих символов \r и \b а как именно Вы будете на консоль их выводить - не важно.

>>> print 'too much is not enough', '\b'*12, 'definitely enough'
too much is definitely enough

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version