Como imprimir sem nova linha ou espaço?

1872

Eu gostaria de fazê-lo . O que eu gostaria de fazer neste exemplo em:

Em C:

#include <stdio.h>

int main() {
    int i;
    for (i=0; i<10; i++) printf(".");
    return 0;
}

Resultado:

..........

Em Python:

>>> for i in range(10): print('.')
.
.
.
.
.
.
.
.
.
.
>>> print('.', '.', '.', '.', '.', '.', '.', '.', '.', '.')
. . . . . . . . . .

No Python printirá adicionar um \nou espaço, como posso evitar isso? Agora, é apenas um exemplo, não me diga que eu posso primeiro construir uma string e depois imprimi-la. Eu gostaria de saber como "anexar" as strings stdout.

Andrea Ambu
fonte
8
Para aqueles que buscam a string de documentação de python formatação: docs.python.org/library/stdtypes.html#string-formatting
guettli
1
Parece que uma pergunta semelhante havia sido feita anteriormente: https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

Respostas:

2535

No Python 3, você pode usar os parâmetros sep=e end=da printfunção:

Para não adicionar uma nova linha ao final da string:

print('.', end='')

Para não adicionar um espaço entre todos os argumentos da função que você deseja imprimir:

print('a', 'b', 'c', sep='')

Você pode passar qualquer sequência para qualquer parâmetro e pode usar os dois parâmetros ao mesmo tempo.

Se você estiver tendo problemas com o buffer, poderá liberar a saída adicionando flush=Trueargumento de palavra-chave:

print('.', end='', flush=True)

Python 2.6 e 2.7

No Python 2.6, você pode importar a printfunção do Python 3 usando o __future__módulo :

from __future__ import print_function

que permite usar a solução Python 3 acima.

No entanto, observe que a flushpalavra-chave não está disponível na versão da printfunção importada do __future__Python 2; só funciona no Python 3, mais especificamente 3.3 e posterior. Nas versões anteriores, você ainda precisará liberar manualmente com uma chamada para sys.stdout.flush(). Você também precisará reescrever todas as outras instruções de impressão no arquivo em que você faz essa importação.

Ou você pode usar sys.stdout.write()

import sys
sys.stdout.write('.')

Você também pode precisar ligar para

sys.stdout.flush()

para garantir que ele stdoutseja lavado imediatamente.

codelogic
fonte
2
Obrigado! No Python 3.6.3, esse flush = True é crucial, caso contrário não funciona conforme o esperado.
gunit
3
Alguém pode explicar por que eu precisaria flushe o que isso realmente faz?
Rishav 4/02/19
5
Está alguns meses atrasado, mas responder @Rishav flush esvazia o buffer e exibe a saída agora. Sem liberação, você pode eventualmente imprimir o texto exato, mas apenas quando o sistema processa os gráficos em vez do IO. Liberar torna o texto visível imediatamente "liberando" o cache.
Great Turtle
297

Deve ser tão simples como descrito neste link por Guido Van Rossum:

Re: Como se imprime sem ac / r?

http://legacy.python.org/search/hypermail/python-1992/0115.html

É possível imprimir algo, mas não anexar automaticamente um retorno de carro?

Sim, acrescente uma vírgula após o último argumento a ser impresso. Por exemplo, esse loop imprime os números 0..9 em uma linha separada por espaços. Observe a "impressão" sem parâmetros que adiciona a nova linha final:

>>> for i in range(10):
...     print i,
... else:
...     print
...
0 1 2 3 4 5 6 7 8 9
>>> 
KDP
fonte
99
Este é especificamente listados na questão de comportamento indesejável por causa dos espaços
Zags
87
Pelo contrário, a resposta deve ser excluída por dois motivos: tem efeitos colaterais indesejáveis ​​que você não pode desativar (espaços extras incluídos) e não é compatível com o python 3 (o parêntese força a conversão em uma tupla) . Espero esses tipos de construções de má qualidade do PHP, não do Python. Portanto, é melhor nunca usar isso.
Eric Leschinski
9
//, porém, é a maneira mais simples de fazer isso no Python 2, e há MUITO código único por aí para sistemas operacionais realmente antigos. Provavelmente não é a melhor solução, ou mesmo recomendada. No entanto, uma das grandes vantagens do StackOverflow é que ele nos permite saber quais truques esquisitos existem. KDP, você incluiria um aviso rápido no topo sobre o que @Eric Leschinski disse? Faz sentido, afinal.
Nathan Basanese 31/08/2015
23
@nathanbasanese Simples ou não, ele tem um efeito colateral que o solicitante não deseja explicitamente . Votado.
Shadur
8
270 votos positivos para uma resposta que especificamente não responda à pergunta. Bom trabalho pessoal votando. Bom trabalho.
Cylindric
168

Nota: O título desta pergunta costumava ser algo como "Como imprimir em python?"

Como as pessoas podem vir procurá-lo com base no título, o Python também suporta a substituição no estilo printf:

>>> strings = [ "one", "two", "three" ]
>>>
>>> for i in xrange(3):
...     print "Item %d: %s" % (i, strings[i])
...
Item 0: one
Item 1: two
Item 2: three

E você pode facilmente multiplicar os valores das strings:

>>> print "." * 10
..........
Beau
fonte
10
Na verdade, está faltando o ponto. :) Como já havia uma ótima resposta para a pergunta, eu estava apenas elaborando algumas técnicas relacionadas que podem ser úteis.
Beau
8
Com base no título da pergunta, creio que esta resposta é analógico mais apropriado como um comumente usa printf em C / C ++
Dan
16
Isso responde ao título da pergunta, mas não ao corpo. Dito isto, ele me forneceu o que estava procurando. :)
ayman
2
não é a resposta para a pergunta
Vanuan
4
@Vanuan, expliquei no final da minha resposta que o título da pergunta mudou em algum momento. :)
Beau
93

Use a função de impressão no estilo python3 para python2.6 + (também quebrará quaisquer instruções de impressão com palavras-chave existentes no mesmo arquivo.)

# for python2 to use the print() function, removing the print keyword
from __future__ import print_function
for x in xrange(10):
    print('.', end='')

Para não estragar todas as palavras-chave de impressão python2, crie um printf.pyarquivo separado

# printf.py

from __future__ import print_function

def printf(str, *args):
    print(str % args, end='')

Em seguida, use-o no seu arquivo

from printf import printf
for x in xrange(10):
    printf('.')
print 'done'
#..........done

Mais exemplos mostrando o estilo printf

printf('hello %s', 'world')
printf('%i %f', 10, 3.14)
#hello world10 3.140000
k107
fonte
39

Como imprimir na mesma linha:

import sys
for i in xrange(0,10):
   sys.stdout.write(".")
   sys.stdout.flush()
lenooh
fonte
27

A nova função (a partir do Python 3.x) printpossui um endparâmetro opcional que permite modificar o caractere final:

print("HELLO", end="")
print("HELLO")

Resultado:

OLÁ OLÁ

Há também seppara separador:

print("HELLO", "HELLO", "HELLO", sep="")

Resultado:

OLA OLA OLA

Se você quiser usá-lo no Python 2.x, basta adicioná-lo no início do seu arquivo:

from __future__ import print_function

SilentGhost
fonte
1
o que "sep" faz?
McPeppr 30/08/19
1
@ McPeppr Eu sei que isso é antigo, mas editei a resposta para mais clareza. Verifique agora.
TheTechRobo36414519
Obrigado pela edição. setembro será útil. Até agora eu usei sep.join (list) para concatenar elementos de uma lista com um separador no meio - perfeito para gravar arquivos csv
McPeppr
21

Usando functools.partial para criar uma nova função chamada printf

>>> import functools

>>> printf = functools.partial(print, end="")

>>> printf("Hello world\n")
Hello world

Maneira fácil de agrupar uma função com parâmetros padrão.

sohail288
fonte
16

Você pode simplesmente adicionar ,no final da printfunção para que ela não seja impressa em uma nova linha.

user3763437
fonte
1
//, na verdade, isso não imprimiu nada. Não precisamos adicionar outra instrução de impressão sem um argumento no final, como mostrado em stackoverflow.com/a/493500/2146138 ? Você gostaria de editar esta resposta com um exemplo muito curto de duas ou três linhas?
Nathan Basanese 31/08/2015
3
O doesn OP; t quer um espaço anexado
pppery
2
Não respondeu a pergunta. Sem espaços.
Shrewmouse #
Isso não funciona mais no Python 2.xe responde apenas à metade do que o OP queria. Por que 16 votos positivos?
TheTechRobo36414519
12

No Python 3+, printé uma função. Quando Você ligar

print('hello world')

Python traduz para

print('hello world', end='\n')

Você pode mudar endpara o que quiser.

print('hello world', end='')
print('hello world', end=' ')
Yaelle
fonte
8

python 2.6+ :

from __future__ import print_function # needs to be first statement in file
print('.', end='')

python 3 :

print('.', end='')

python <= 2.5 :

import sys
sys.stdout.write('.')

se houver espaço extra após cada impressão, em python 2

print '.',

enganoso no python 2 - evite :

print('.'), # avoid this if you want to remain sane
# this makes it look like print is a function but it is not
# this is the `,` creating a tuple and the parentheses enclose an expression
# to see the problem, try:
print('.', 'x'), # this will print `('.', 'x') `
n611x007
fonte
8

Podes tentar:

import sys
import time
# Keeps the initial message in buffer.
sys.stdout.write("\rfoobar bar black sheep")
sys.stdout.flush()
# Wait 2 seconds
time.sleep(2)
# Replace the message with a new one.
sys.stdout.write("\r"+'hahahahaaa             ')
sys.stdout.flush()
# Finalize the new message by printing a return carriage.
sys.stdout.write('\n')
alvas
fonte
5

Você pode fazer o mesmo em python3 da seguinte maneira:

#!usr/bin/python

i = 0
while i<10 :
    print('.',end='')
    i = i+1

e execute-o com python filename.pyoupython3 filename.py

Subbu
fonte
5

recentemente tive o mesmo problema ..

eu o resolvi fazendo:

import sys, os

# reopen stdout with "newline=None".
# in this mode,
# input:  accepts any newline character, outputs as '\n'
# output: '\n' converts to os.linesep

sys.stdout = os.fdopen(sys.stdout.fileno(), "w", newline=None)

for i in range(1,10):
        print(i)

isso funciona no unix e no windows ... não o testou no macosx ...

hth

ssgam
fonte
2
Quebrasys.__stdout__
pppery
4

@lenooh atendeu minha pergunta. Eu descobri este artigo enquanto procurava por 'python suprimir nova linha'. Estou usando o IDLE3 no Raspberry Pi para desenvolver o Python 3.2 para PuTTY. Eu queria criar uma barra de progresso na linha de comando do PuTTY. Eu não queria que a página rolasse para longe. Eu queria uma linha horizontal para garantir ao usuário que o programa não ficasse paralisado nem foi enviado para almoçar em um loop infinito e alegre - como um pedido para 'me deixar em paz, estou indo bem', mas isso pode levar algum tempo. mensagem interativa - como uma barra de progresso no texto.

Ele print('Skimming for', search_string, '\b! .001', end='')inicializa a mensagem preparando-se para a próxima gravação na tela, que imprimirá três backspaces como ⌫⌫⌫ rubout e depois um ponto, apagando '001' e estendendo a linha de pontos. Após o search_stringpapagaio de entrada do usuário, o \b!apara o ponto de exclamação do meu search_stringtexto para retornar ao espaço que de print()outra forma força, colocando corretamente a pontuação. Isso é seguido por um espaço e o primeiro 'ponto' da 'barra de progresso' que estou simulando. Desnecessariamente, a mensagem também é iniciada com o número da página (formatado para um comprimento de três com zeros à esquerda) para notificar o usuário de que o progresso está sendo processado e que também refletirá a contagem de períodos que construiremos posteriormente para o direita.

import sys

page=1
search_string=input('Search for?',)
print('Skimming for', search_string, '\b! .001', end='')
sys.stdout.flush() # the print function with an end='' won't print unless forced
while page:
    # some stuff…
    # search, scrub, and build bulk output list[], count items,
    # set done flag True
    page=page+1 #done flag set in 'some_stuff'
    sys.stdout.write('\b\b\b.'+format(page, '03')) #<-- here's the progress bar meat
    sys.stdout.flush()
    if done: #( flag alternative to break, exit or quit)
        print('\nSorting', item_count, 'items')
        page=0 # exits the 'while page' loop
list.sort()
for item_count in range(0, items)
    print(list[item_count])
#print footers here
 if not (len(list)==items):
    print('#error_handler')

A carne da barra de progresso está na sys.stdout.write('\b\b\b.'+format(page, '03'))linha. Primeiro, para apagar à esquerda, ele faz o backup dos três caracteres numéricos com o '\ b \ b \ b' como ⌫⌫⌫ rubout e elimina um novo período para adicionar ao comprimento da barra de progresso. Em seguida, ele grava três dígitos da página para a qual avançou até o momento. Como sys.stdout.write()aguarda um buffer completo ou o canal de saída fechar, isso sys.stdout.flush()força a gravação imediata. sys.stdout.flush()é construído no final do print()qual é ignorado print(txt, end='' ). Em seguida, o código percorre suas operações intensivas de tempo mundano enquanto não imprime mais nada até retornar aqui para limpar três dígitos, adicionar um ponto final e escrever três dígitos novamente, incrementados.

Os três dígitos apagados e reescritos não são de forma alguma necessários - é apenas um floreio que exemplifica sys.stdout.write()versus print(). Você também pode preparar com facilidade um período e esquecer os três extremos backslash-b fancy (é claro que também não escreve contagens de páginas formatadas) apenas imprimindo a barra do período mais uma vez a cada vez - sem espaços ou novas linhas usando apenas o sys.stdout.write('.'); sys.stdout.flush()par.

Observe que o shell Raspberry Pi IDLE3 Python não honra o backspace como ⌫ rubout, mas imprime um espaço, criando uma lista aparente de frações.

- (o = 8> wiz

DisneyWizard
fonte
4

Você notará que todas as respostas acima estão corretas. Mas eu queria criar um atalho para sempre escrever o parâmetro "end = ''" no final.

Você pode definir uma função como

def Print(*args,sep='',end='',file=None,flush=False):
    print(*args,sep=sep,end=end,file=file,flush=flush)

Aceitaria todo o número de parâmetros. Mesmo ele aceita todos os outros parâmetros como arquivo, descarga, etc e com o mesmo nome.

Bikram Kumar
fonte
Ele não roda, ele reclama que *argestá no começo (python 2.7), e colocá-lo no final foi executado, mas não funcionou completamente certo. Eu defini uma função que só pegava Print(*args)e depois chamava print with sep='', end=''. E agora funciona como eu quero. Então, um voto positivo para a ideia.
Otzen
4

Muitas dessas respostas parecem um pouco complicadas. No Python 3.x, você simplesmente faz isso:

print(<expr>, <expr>, ..., <expr>, end=" ")

O valor padrão de final é "\n". Estamos simplesmente mudando para um espaço ou você também pode usar end=""(sem espaço) para fazer o que printfnormalmente faz.

jarr
fonte
3

você deseja imprimir algo no loop for certo, mas não deseja que ele imprima sempre em nova linha .. por exemplo:

 for i in range (0,5):
   print "hi"

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

mas você deseja que imprima assim: oi oi oi oi oi oi certo ???? basta adicionar uma vírgula após imprimir "oi"

Exemplo:

for i in range (0,5): print "hi", OUTPUT: hi hi hi hi hi

Bala.K
fonte
5
Não, o OP quer hihihihihi, não oi oi oi oi oi #
Cool Javelin
1

Ou tem uma função como:

def Print(s):
   return sys.stdout.write(str(s))

Então agora:

for i in range(10): # or `xrange` for python 2 version
   Print(i)

Saídas:

0123456789
Sub-10
fonte
0
for i in xrange(0,10): print '\b.',

Isso funcionou em 2.7.8 e 2.5.2 (terminal Canopy e OSX, respectivamente) - nenhuma importação de módulo ou viagem no tempo necessária.

cansativo
fonte
8
Isso imprime caracteres de backspace na saída padrão. Pode parecer correto se a saída padrão for um terminal, mas se for redirecionada para um arquivo, esse arquivo conterá caracteres de controle.
Keith Thompson
1
É verdade, mas eu não posso imaginar que alguém iria querer usar isso para outra coisa senão uma barra de progresso de baixa tecnologia ...
tyersome
1
No entanto, o código Python não faz a mesma coisa que o código C na pergunta.
Keith Thompson
você pode testar sys.stdout.isatty()se não for redirecionado para um arquivo.
fcm
0

Existem duas maneiras gerais de fazer isso:

Imprimir sem nova linha no Python 3.x

Não anexe nada após a instrução print e remova '\ n' usando end='' como:

>>> print('hello')
hello  # appending '\n' automatically
>>> print('world')
world # with previous '\n' world comes down

# solution is:
>>> print('hello', end='');print(' world'); # end with anything like end='-' or end=" " but not '\n'
hello world # it seem correct output

Outro exemplo no loop :

for i in range(1,10):
    print(i, end='.')

Imprimir sem nova linha no Python 2.x

A adição de uma vírgula à direita indica que, após a impressão, ignore \n.

>>> print "hello",; print" world"
hello world

Outro exemplo no loop :

for i in range(1,10):
    print "{} .".format(i),

Espero que isso ajude você. Você pode visitar este link .

susan097
fonte
E o espaço?
Shrewmouse # 3/18
use end=" "eg: print ('hello', end = '' "); print ('world')
susan097
Sua solução 2.7 não remove o espaço.
Shrewmouse # 3/18
Menciono que remova '\ n' não o espaço, o espaço é por padrão em python2. Veja o que isso parece: print 'hello' ;print'there'em paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097
Certo, é por isso que sua resposta foi rejeitada. Você não respondeu à pergunta "Como imprimir sem nova linha ou espaço?". Sua resposta para 2.x não responde à pergunta. Você responde pelo 3.0 é o mesmo que muitas das outras respostas postadas há mais de nove anos. Em resumo, esta resposta não adiciona nada de útil à comunidade e você deve excluí-la.
Shrewmouse
-3

... você não precisa importar nenhuma biblioteca. Basta usar o caractere de exclusão:

BS=u'\0008' # the unicode for "delete" character
for i in range(10):print(BS+"."),

isso remove a nova linha e o espaço (^ _ ^) *

mchrgr2000
fonte