Найти - Пользователи
Полная версия: Перезапись вывода в командную строку
Начало » Python для новичков » Перезапись вывода в командную строку
1 2
chet
Просто стало интересно, можно ли так сделать?
Например, хочу вывести на экран ход выполнения проги в процентах.
То есть можно ли перезаписать print определенной переменной в предыдущей итерации?
Chern
>>> import sys
>>> for i in range(100000):
...     sys.stdout.write('\r%s' % i)
...     sys.stdout.flush()

ключевой момент - ‘\r’
beelze
думаю, этого достаточно будет:
>>> print '123\b\baa'
1aa
chet
Спасибо Chern
Я уже нашел в книжке именно этот способ под названием “индикатор выполнения процесса”!
beelze этот способ я попробовал, но перезаписи нет!

beelze
>этот способ я попробовал, но перезаписи нет!
и под win и под linux это работает. а что значит «нет перезаписи»? print ‘123\b\baa’ выдает не «1aa» а «123aa»? Смысл \b (backspace) в том, что иногда неудобно всю строку перепечатывать - логика вывода «заголовка» и собственно перезаписываемой части может быть разнесена, поэтому стирается (нужным к-вом \b) только то, что было ранее выведено в рамках «перезаписываемости». Ну и конечно, IRL надо, как указал Chern, использовать именно sys.stdout.write() и .flush() - я иллюстрировал только использование \b, без «готового» кода
chet
beelze выдает “1аа” все нормально. Только мне надо выводить изменяемую переменную в цикле.
Нет перезаписи - это значит, что по Вашему варианту выводится результат в столбик с каждой итерацией, а мне нужен вывод результата текущей итерации!
то есть не так:
0%
1%
2%
и т.д.
В примере с процентом выполнения проги - это текущий процент, а остальных процентов на экране не должно быть!
cutwater
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)
beelze
chet, вопрос был про перезапись, так? вот я и предоставил пример собственно перезаписи, а не «готового» кода. Остальное Chern детально пояснил, а я детально пояснил принципиальную разницу. Нужно же принцип понимать а не просто куски кода копипастить.
chet
cutwater смотрите сообщение Chern. Повтор.
Так покажите же как Вы это делаете?
А такие вопросы возникают, когда не читаете предыдущие сообщения и сразу на людей кидаться)))


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



beelze
>С помощью 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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB