Eu gostaria de fazer várias declarações que fornecem saída padrão sem ver novas linhas entre as declarações.
Especificamente, suponha que eu tenha:
for item in range(1,100):
print item
O resultado é:
1
2
3
4
.
.
.
Como é que isso se parece:
1 2 3 4 5 ...
Melhor ainda, é possível imprimir o número único sobre o último número, para que apenas um número esteja na tela por vez?
Respostas:
Mude
print item
para:print item,
no Python 2.7print(item, end=" ")
em Python 3Se você deseja imprimir os dados dinamicamente, use a seguinte sintaxe:
print(item, sep=' ', end='', flush=True)
em Python 3fonte
'\n'
caractere é escrito no final, a menos que aprint
instrução termine com uma vírgula. Essa é a única ação se a instrução contiver apenas a palavra-chaveprint
.flush
não funciona comfrom __future__ import print_function
infelizmente.print(item, end=", ")
isso, então também adiciona,
para o último item como fazer impedi-lo de adição,
para o último itemEm geral, a maneira de fazer isso é com os códigos de controle do terminal . Este é um caso particularmente simples, para o qual você só precisa de um caractere especial: U + 000D CARRIAGE RETURN, escrito
'\r'
em Python (e em muitos outros idiomas). Aqui está um exemplo completo com base no seu código:Algumas coisas sobre isso que podem ser surpreendentes:
\r
vai no início da string para que, enquanto o programa estiver em execução, o cursor esteja sempre após o número. Isso não é apenas cosmético: alguns emuladores de terminal ficam muito confusos se você fizer o contrário.stdout.flush
é necessário em alguns sistemas ou você não obterá nenhuma saída. Outros sistemas podem não exigir, mas não causam danos.Se você achar que isso não funciona, a primeira coisa que você deve suspeitar é que o seu emulador de terminal está com erros. O programa vttest pode ajudá-lo a testá-lo.
Você pode substituir o
stdout.write
por umaprint
declaração, mas eu prefiro não misturarprint
com o uso direto de objetos de arquivo.fonte
flush()
força um arquivo a enviar o que for necessário para o sistema operacional no momento. Estou surpreso que funcione para você sem isso - não funcionou para mim até que eu o adicionei.ncurses
faça.sys.stdout.flush()
parece ser mendatory no meuFreebsd
comPython 2.7
Use
print item,
para fazer com que a declaração de impressão omita a nova linha.No Python 3, é
print(item, end=" ")
.Se você deseja que todos os números sejam exibidos no mesmo local, use, por exemplo (Python 2.7):
No Python 3, é um pouco mais complicado; aqui você precisa liberar
sys.stdout
ou não imprimirá nada até que o loop termine:fonte
Como os outros exemplos,
uso uma abordagem semelhante, mas em vez de gastar tempo calculando o último tamanho da saída, etc.,
Eu simplesmente uso escapes de código ANSI para retornar ao início da linha e, em seguida, limpar toda a linha antes de imprimir minha saída de status atual.
Para usar em seu loop de iteração, basta chamar algo como:
Veja mais aqui
fonte
Você pode adicionar uma vírgula à sua declaração de impressão para imprimir um espaço em vez de uma nova linha em cada iteração:
Como alternativa, se você estiver usando o Python 2.6 ou posterior, poderá usar a nova função de impressão, que permitiria especificar que nem mesmo um espaço chegaria ao final de cada item que está sendo impresso (ou permitir que você especifique qualquer que seja o final) quer):
Por fim, você pode gravar diretamente na saída padrão importando-a do módulo sys, que retorna um objeto semelhante a um arquivo:
fonte
mudança
para
fonte
\033[K
código? Eu gostaria de aprender mais sobre eles.print
já libera internamente. Não há necessidade de chamá-lo.print
é diferente desys.stdout.write()
onde você precisa liberar a telaEu acho que uma junção simples deve funcionar:
fonte
print ' '.join(str(x) for x in range(1, 10))
.Outra resposta que estou usando no 2.7, onde estou apenas imprimindo um "." toda vez que um loop é executado (para indicar ao usuário que as coisas ainda estão em execução) é o seguinte:
Imprime o "." caracteres sem espaços entre cada um. Parece um pouco melhor e funciona muito bem. O \ b é um caractere de backspace para quem está se perguntando.
fonte
Tantas respostas complicadas. Se você possui o python 3, basta colocar
\r
no início da impressão e adicionarend='', flush=True
a ele:Isso vai escrever
0 foo bar
, então1 foo bar
etc, no local.fonte
print('\r' + filename + " ", end = '', flush=True)
Para fazer com que os números se substituam, você pode fazer algo assim:
Isso deve funcionar desde que o número seja impresso na primeira coluna.
EDIT: Aqui está uma versão que funcionará mesmo que não seja impressa na primeira coluna.
Devo observar que esse código foi testado e funciona perfeitamente no Python 2.5 no Windows, no console do Windows. De acordo com alguns outros, a descarga do stdout pode ser necessária para ver os resultados. YMMV.
fonte
"A propósito ...... Como atualizá-lo toda vez para que você imprima mi em um só lugar, basta alterar o número."
É um tópico realmente complicado. O que o zack sugeriu (enviar códigos de controle do console) é uma maneira de conseguir isso.
Você pode usar (n) maldições, mas isso funciona principalmente em * nixes.
No Windows (e aqui vai a parte interessante), que raramente é mencionada (não entendo o porquê), você pode usar as ligações do Python ao WinAPI ( http://sourceforge.net/projects/pywin32/ também com o ActivePython por padrão) - não é tão difícil e funciona bem. Aqui está um pequeno exemplo:
Ou, se você deseja usar
print
(instrução ou função, não há diferença):win32console
O módulo permite que você faça muitas coisas mais interessantes com o console do Windows ... Eu não sou um grande fã do WinAPI, mas recentemente percebi que pelo menos metade da minha antipatia por isso foi causada pela escrita do código WinAPI nas ligações Python C muito mais fácil de usar.Todas as outras respostas são ótimas e pitônicas, é claro, mas ... E se eu quisesse imprimir na linha anterior ? Ou escreva um texto com várias linhas, depois limpe-o e escreva as mesmas linhas novamente? Minha solução torna isso possível.
fonte
para Python 2.7
para Python 3
fonte
fonte
Se você quiser apenas imprimir os números, pode evitar o loop.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 levou 21.1986929975ms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 levou 491.466823551ms
fonte
map
.A melhor maneira de conseguir isso é usar o
\r
personagemApenas tente o código abaixo:
fonte
No Python 3, você pode fazer o seguinte:
Saídas:
Tupla: você pode fazer o mesmo com uma tupla:
Saídas:
Outro exemplo:
Saídas:
Você pode até descompactar sua tupla assim:
Saídas:
outra variação:
Saídas:
fonte
Uma vírgula no final da instrução print omite a nova linha.
mas isso não substitui.
fonte
Para aqueles que lutam como eu, criei o seguinte que parece funcionar no python 3.7.4 e 3.5.2.
Eu ampliei o intervalo de 100 para 1.000.000 porque ele roda muito rápido e você pode não ver a saída. Isso ocorre porque um efeito colateral da configuração
end='\r'
é que a iteração do loop final limpa toda a saída. Era necessário um número maior para demonstrar que funciona. Esse resultado pode não ser desejável em todos os casos, mas foi bom no meu, e o OP não especificou uma maneira ou de outra. Você poderia contornar isso com uma instrução if que avalia o comprimento da matriz que está sendo iterada, etc. A chave para fazê-la funcionar no meu caso era acoplar os colchetes"{}"
a.format()
. Caso contrário, não funcionou.Abaixo deve funcionar como está:
fonte
Saída: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,92,93,94,963 utilizadores
fonte
Ou ainda mais simples:
end="\r"
sobrescreverá do início [0:] da primeira impressão.fonte