\r em Python não exclui a linha inteira

Aug 31 2020

estou com um problema bastante complexo, mas aqui está a "versão mais simples" para que você possa entender melhor.

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

e aqui tudo funciona bem, o problema vem quando tento fazer uma contagem regressiva

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

a saída é 10... depois 90... 80... 70 e assim por diante, parece que a segunda cifra da 10 não é cancelada. Alguém pode me dizer o porquê?

Respostas

2 tzaman Aug 31 2020 at 01:46

\rmove o cursor para o início da linha, mas não "limpa" nada já impresso, a menos que você o sobrescreva (isso pode depender da plataforma). Assim, o 0personagem permanecerá visível. Você pode lidar com isso sempre imprimindo uma coluna de "largura fixa", para que os espaços vazios sejam impressos para apagar qualquer coisa que tenha sobrado de antes. Você também pode simplesmente colocar o CR no endparâmetro.
Por isso:

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

Isso usa um especificador de formato para indicar uma coluna de largura preenchida, <alinhada à esquerda. 3Você pode alterar 3para qualquer número maior, dependendo de quantos dígitos seu contador precisa.

1 ManasSambare Aug 31 2020 at 01:42

É causado por um erro simples, você está perdendo um espaço antes do \r:

Seu código:

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

Altere para:

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

O problema é como as máquinas de escrever antigas, quando você pressiona \ro retorno de carro, ele vai para o início da linha e altera um caractere a partir daí. então 10 se tornará 90 quando o primeiro caractere for alterado.

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

Portanto, uma solução potencial é fixar a largura. aqui eu fiz 2 dígitos