\ r в Python не удаляет всю строку

Aug 31 2020

У меня довольно сложная проблема, но вот «самая простая версия», чтобы вы могли лучше ее понять.

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 не отменен. Может кто-нибудь сказать мне, почему?

Ответы

2 tzaman Aug 31 2020 at 01:46

\rперемещает курсор в начало строки, но не «очищает» уже напечатанное, если вы не перезаписываете его (это может зависеть от платформы). Таким образом 0персонаж останется видимым. Вы можете справиться с этим, всегда печатая столбец «фиксированной ширины», так что пустые места печатаются, чтобы вычеркнуть все, что осталось от предыдущего. Вы также можете просто указать CR в endпараметре.
Таким образом:

import time
for i in range(10):
   time.sleep(1)
   print('{: <3}'.format(10-i), end='\r')

Здесь используется спецификатор формата, чтобы указать заполненный пробелами столбец -width с <выравниванием по левому краю 3. Вы можете изменить на 3любое большее число в зависимости от того, сколько цифр нужно вашему счетчику.

1 ManasSambare Aug 31 2020 at 01:42

Это вызвано простой ошибкой, вам не хватает пробела перед \ r:

Ваш код:

   print('{}\r'.format(10-i), end="")
   # > 10,90,80

Измените его на:

   print('{} \r'.format(10-i), 
   #> 10, 9, 8
1 venky__ Aug 31 2020 at 01:44

Проблема похожа на старые пишущие машинки, когда вы нажимаете \rвозврат каретки, она переходит в начало строки и меняет один символ оттуда. поэтому 10 станет 90 при смене первого символа.

import time
for i in range(10):
    time.sleep(1)
    print('{:02d}'.format(10-i), end="\r")

Итак, одно из возможных решений - исправить ширину. здесь я сделал это 2-х значным