Se eu tivesse o seguinte código:
for x in range(10):
print x
Eu obteria a saída de
1
2
etc..
O que eu gostaria de fazer é, em vez de imprimir uma nova linha, quero substituir o valor anterior e substituí-lo pelo novo valor na mesma linha.
Respostas:
Uma maneira é usar o
'\r'
caractere de retorno de carro ( ) para retornar ao início da linha sem avançar para a próxima linha:A vírgula no final da instrução de impressão diz para não ir para a próxima linha. A última instrução de impressão avança para a próxima linha para que seu prompt não substitua sua saída final.
Atualizar
Agora que Python 2 é EOL, uma resposta de Python 3 faz mais sentido. Para Python 3.5 e anterior:
No Python 3.6 e posterior, as strings f são lidas melhor:
fonte
%
operador está obsoleto. Basicamente, todas as strings agora têm um método de formatação . Nesse caso,{0}
significa "o primeiro argumento paraformat()
" (a contagem começa em 0).re.sub(r'\$<\d+>[/*]?', '', curses.tigetstr('el') or '')
fornecerá a seqüência correta de apagar até o fim da linha para qualquer terminal que o usuário tenha. Lembre-se de inicializarcurses
com algo comocurses.setupterm(fd=sys.stdout.fileno())
e usesys.stdout.isatty()
para ter certeza de que sua saída não está sendo redirecionada para um arquivo. Consulte code.activestate.com/recipes/475116 para um módulo Python completo com controle de cursor e suporte a cores.import curses; curses.setupterm(fd=sys.stdout.fileno()); print(hex(curses.tigetstr('cr')));
deve imprimir os códigos hexadecimais da seqüência de caracteres para ir para o início da linha.Como acabei aqui por meio do Google, mas estou usando Python 3, é assim que funcionaria em Python 3:
Resposta relacionada aqui: Como posso suprimir a nova linha após uma declaração de impressão?
fonte
testing
e sua segunda impressão de loop,test
a saída após a segunda passagem ainda serátesting
- agora vejo que @ Nagasaki45 apontou issoprint("\r", message, end="")
A resposta de @Mike DeSimone provavelmente funcionará na maioria das vezes. Mas...
Isso ocorre porque o
'\r'
único volta para o início da linha, mas não limpa a saída.EDIT: Melhor solução (do que minha antiga proposta abaixo)
Se o suporte POSIX for suficiente para você, o seguinte limparia a linha atual e deixaria o cursor em seu início:
Ele usa o código de escape ANSI para limpar a linha do terminal. Mais informações podem ser encontradas na wikipedia e nesta ótima palestra .
Resposta antiga
A solução (não tão boa) que encontrei se parece com esta:
Uma vantagem é que também funciona no Windows.
fonte
Eu tinha a mesma pergunta antes de visitar este tópico. Para mim, o sys.stdout.write funcionou apenas se eu limpar o buffer corretamente, ou seja,
Sem flushing, o resultado é impresso apenas no final do script
fonte
stringvar.ljust(10,' ')
no caso de strings com comprimento variável.Suprima a nova linha e imprima
\r
.ou escreva para stdout:
fonte
Experimente isto:
Funcionou para mim A
end="\r"
parte está fazendo com que sobrescreva a linha anterior.AVISO!
Se você imprimir e
hi
, em seguida, imprimirhello
usando\r
, você obteráhillo
porque a saída escreveu sobre as duas letras anteriores. Se você imprimirhi
com espaços (que não aparecem aqui), ele será impressohi
. Para corrigir isso, imprima os espaços usando\r
.fonte
Hi BobHi BobHi BobHi BobHi Bob
. Python 3.7.1\r
está no início, e não no fim.Não consegui fazer com que nenhuma das soluções desta página funcionasse para IPython , mas uma ligeira variação na solução de @Mike-Desimone resolveu: em vez de terminar a linha com o retorno de carro, comece a linha com o retorno de carro:
Além disso, essa abordagem não requer a segunda instrução de impressão.
fonte
time.sleep (0,5) é para mostrar como a saída anterior é apagada e a nova saída é impressa "\ r" quando está no início da mensagem de impressão, ela irá apagar a saída anterior antes da nova saída.
fonte
Isso funciona no Windows e python 3.6
fonte
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):
A saída será semelhante a esta:
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:
E agora ele imprime conforme o esperado:
fonte
Aqui está uma versão mais limpa e "plug-and-play" da resposta de @ Nagasaki45. Ao contrário de muitas outras respostas aqui, ele funciona corretamente com strings de comprimentos diferentes. Ele consegue isso limpando a linha com tantos espaços quanto o comprimento da impressão da última linha. Também funcionará no Windows.
Uso
Basta usá-lo assim:
Este pequeno teste mostra que as linhas são eliminadas corretamente, mesmo para comprimentos diferentes:
fonte
Estou um pouco surpreso por ninguém estar usando o caractere de retrocesso. Aqui está um que o usa.
fonte
sys.stdout.flush()
(Python3) Isso é o que funcionou para mim. Se você apenas usar o \ 010, ele deixará caracteres, então eu ajustei um pouco para ter certeza de que está substituindo o que estava lá. Isso também permite que você tenha algo antes do primeiro item de impressão e apenas remova o comprimento do item.
fonte
Mais uma resposta com base nas respostas anteriores.
Conteúdo de pbar.py: import sys, shutil, datetime
Uso do script:
fonte
Aqui está minha solução! Windows 10, Python 3.7.1
Não sei por que esse código funciona, mas apaga completamente a linha original. Compilei com base nas respostas anteriores. As outras respostas apenas retornariam a linha ao início, mas se você tivesse uma linha mais curta depois, pareceria bagunçada como se
hello
transforma embyelo
.Saída - Cada linha será reescrita sem qualquer texto antigo mostrando:
Próxima linha (completamente reescrita na mesma linha):
fonte
Melhor substituir toda a linha, caso contrário, a nova linha se misturará com as antigas se a nova linha for mais curta.
Tive que usar
columns - 1
no Windows.fonte