\ r в Python не удаляет всю строку
У меня довольно сложная проблема, но вот «самая простая версия», чтобы вы могли лучше ее понять.
import time
for i in range(10):
time.sleep(1)
print('{}\r'.format(i), end="")
а тут все работает нормально, проблема возникает когда я пытаюсь сделать обратный отсчет
import time
for i in range(10):
time.sleep(1)
print('{}\r'.format(10-i), end="")
вывод будет 10 ... затем 90 ... 80 ... 70 и так далее, похоже, если второй шифр из 10 не отменен. Может кто-нибудь сказать мне, почему?
Ответы
\rперемещает курсор в начало строки, но не «очищает» уже напечатанное, если вы не перезаписываете его (это может зависеть от платформы). Таким образом 0персонаж останется видимым. Вы можете справиться с этим, всегда печатая столбец «фиксированной ширины», так что пустые места печатаются, чтобы вычеркнуть все, что осталось от предыдущего. Вы также можете просто указать CR в endпараметре.
Таким образом:
import time
for i in range(10):
time.sleep(1)
print('{: <3}'.format(10-i), end='\r')
Здесь используется спецификатор формата, чтобы указать заполненный пробелами столбец -width с <выравниванием по левому краю 3. Вы можете изменить на 3любое большее число в зависимости от того, сколько цифр нужно вашему счетчику.
Это вызвано простой ошибкой, вам не хватает пробела перед \ r:
Ваш код:
print('{}\r'.format(10-i), end="")
# > 10,90,80
Измените его на:
print('{} \r'.format(10-i),
#> 10, 9, 8
Проблема похожа на старые пишущие машинки, когда вы нажимаете \rвозврат каретки, она переходит в начало строки и меняет один символ оттуда. поэтому 10 станет 90 при смене первого символа.
import time
for i in range(10):
time.sleep(1)
print('{:02d}'.format(10-i), end="\r")
Итак, одно из возможных решений - исправить ширину. здесь я сделал это 2-х значным