A resposta aceita não é perfeita . A linha que foi impressa primeiro permanecerá lá e se a segunda impressão não cobrir toda a nova linha, você acabará com o texto lixo.
Para ilustrar o problema, salve este código como um script e execute-o (ou apenas dê uma olhada):
import time
n = 100
for i in range(100):
for j in range(100):
print("Progress {:2.1%}".format(j / 100), end="\r")
time.sleep(0.01)
print("Progress {:2.1%}".format(i / 100))
A saída será semelhante a esta:
Progress 0.0%%
Progress 1.0%%
Progress 2.0%%
Progress 3.0%%
O que funciona para mim é limpar a linha antes de deixar uma impressão permanente. Sinta-se à vontade para se ajustar ao seu problema específico:
import time
ERASE_LINE = '\x1b[2K' # erase line command
n = 100
for i in range(100):
for j in range(100):
print("Progress {:2.1%}".format(j / 100), end="\r")
time.sleep(0.01)
print(ERASE_LINE + "Progress {:2.1%}".format(i / 100)) # clear the line first
E agora ele imprime conforme o esperado:
Progress 0.0%
Progress 1.0%
Progress 2.0%
Progress 3.0%