¿Cómo imprimir sin nueva línea o espacio?

1873

Me gustaría hacerlo en . Lo que me gustaría hacer en este ejemplo en:

C ª:

#include <stdio.h>

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

Salida:

..........

En Python:

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

En Python printagregará un \nespacio o, ¿cómo puedo evitar eso? Ahora, es solo un ejemplo, no me digas que primero puedo construir una cadena y luego imprimirla. Me gustaría saber cómo "agregar" cadenas a stdout.

Andrea Ambu
fuente
8
Para aquellos que buscan en la documentación de formato de cadenas de python: docs.python.org/library/stdtypes.html#string-formatting
guettli
1
Parece que se había hecho una pregunta similar anteriormente: https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

Respuestas:

2535

En Python 3, puede usar los parámetros sep=y end=de la printfunción:

Para no agregar una nueva línea al final de la cadena:

print('.', end='')

Para no agregar un espacio entre todos los argumentos de la función que desea imprimir:

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

Puede pasar cualquier cadena a cualquiera de los parámetros, y puede usar ambos parámetros al mismo tiempo.

Si tiene problemas con el almacenamiento en búfer, puede vaciar el resultado agregando flush=Trueargumentos de palabras clave:

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

Python 2.6 y 2.7

Desde Python 2.6 puede importar la printfunción desde Python 3 usando el __future__módulo :

from __future__ import print_function

que le permite usar la solución Python 3 anterior.

Sin embargo, tenga en cuenta que la flushpalabra clave no está disponible en la versión de la printfunción importada de __future__Python 2; solo funciona en Python 3, más específicamente 3.3 y versiones posteriores. En versiones anteriores, aún deberá enjuagarse manualmente con una llamada a sys.stdout.flush(). También tendrá que volver a escribir todas las demás declaraciones de impresión en el archivo donde realiza esta importación.

O puedes usar sys.stdout.write()

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

También puede necesitar llamar

sys.stdout.flush()

para asegurarse de que stdoutse enjuague inmediatamente.

codelogic
fuente
2
¡Gracias! En Python 3.6.3, ese flush = True es crucial, o de lo contrario no funciona según lo previsto.
gunit
3
¿Alguien puede explicar por qué lo necesitaría flushy qué hace realmente?
Rishav
55
Llegan algunos meses de retraso, pero para responder a la descarga de @Rishav se vacía el búfer y se muestra la salida en este momento. Sin vaciado, es posible que eventualmente imprima su texto exacto, pero solo cuando el sistema procese los gráficos en lugar del IO. Flush hace que el texto sea visible inmediatamente al "vaciar" el caché.
Great Turtle
297

Debería ser tan simple como se describe en este enlace por Guido Van Rossum:

Re: ¿Cómo se imprime sin ac / r?

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

¿Es posible imprimir algo pero no se le agrega automáticamente un retorno de carro?

Sí, agregue una coma después del último argumento para imprimir. Por ejemplo, este bucle imprime los números 0..9 en una línea separada por espacios. Tenga en cuenta la "impresión" sin parámetros que agrega la nueva línea final:

>>> for i in range(10):
...     print i,
... else:
...     print
...
0 1 2 3 4 5 6 7 8 9
>>> 
KDP
fuente
99
Esto se enumera específicamente en la pregunta como comportamiento indeseable debido a los espacios
Zags
87
Por el contrario, la respuesta debe eliminarse por dos razones: tiene efectos secundarios indeseables que no puede deshabilitar (espacios adicionales incluidos), y no es compatible con Python 3 (el paréntesis fuerza una conversión a una tupla) . Espero este tipo de construcciones de mala calidad de PHP, no Python. Por lo tanto, es mejor no usar esto.
Eric Leschinski
99
//, sin embargo, esta es la forma más sencilla de hacerlo en Python 2, y hay MUCHO código único para sistemas operativos realmente antiguos. Probablemente no sea la mejor solución, o incluso recomendada. Sin embargo, una de las grandes ventajas de StackOverflow es que nos permite saber qué trucos extraños existen. KDP, ¿incluiría una advertencia rápida en la parte superior sobre lo que dijo @Eric Leschinski? Tiene sentido, después de todo.
Nathan Basanese
23
@nathanbasanese Simple o no, tiene un efecto secundario que el autor de la pregunta no quiere explícitamente . Voto negativo
Shadur
8
270 votos a favor por una respuesta que específicamente no responde la pregunta. Buen trabajo votando amigos. Buen trabajo.
Cylindric
168

Nota: El título de esta pregunta solía ser algo así como "¿Cómo imprimir en Python?"

Dado que las personas pueden venir a buscarlo en función del título, Python también admite la sustitución de 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

Y puede multiplicar fácilmente los valores de cadena:

>>> print "." * 10
..........
Galán
fuente
10
De hecho, se está perdiendo el punto. :) Como ya había una gran respuesta a la pregunta, solo estaba elaborando algunas técnicas relacionadas que podrían resultar útiles.
Beau
8
Basado en el título de la pregunta, creo que esta respuesta es más análoga a cómo se usa comúnmente printf en C / C ++
Dan
16
Esto responde al título de la pregunta, pero no al cuerpo. Dicho esto, me proporcionó lo que estaba buscando. :)
ayman
2
no es la respuesta a la pregunta
Vanuan
44
@Vanuan, expliqué al final de mi respuesta que el título de la pregunta cambió en algún momento. :)
Beau
93

Utilice la función de impresión de estilo python3 para python2.6 + (también romperá las declaraciones de impresión con palabras clave existentes en el mismo archivo).

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

Para no arruinar todas sus palabras clave de impresión python2, cree un printf.pyarchivo separado

# printf.py

from __future__ import print_function

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

Luego, úsalo en tu archivo

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

Más ejemplos que muestran estilo printf

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

Cómo imprimir en la misma línea:

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

La nueva función (a partir de Python 3.x) printtiene un endparámetro opcional que le permite modificar el carácter final:

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

Salida:

HOLA HOLA

También hay seppara separador:

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

Salida:

HOLA HOLA HOLA

Si desea utilizar esto en Python 2.x simplemente agregue esto al comienzo de su archivo:

from __future__ import print_function

SilentGhost
fuente
1
¿Qué hace "sep"?
McPeppr
1
@McPeppr Sé que esto es viejo, pero he editado la respuesta para mayor claridad. Revíselo ahora.
TheTechRobo36414519
Gracias por la edición Sep será útil. Hasta ahora utilicé sep.join (lista) para concatenar elementos de una lista con un separador en el medio - perfecto para escribir archivos csv
McPeppr
21

Usando functools.partial para crear una nueva función llamada printf

>>> import functools

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

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

Manera fácil de ajustar una función con parámetros predeterminados.

sohail288
fuente
16

Simplemente puede agregar ,al final de la printfunción para que no se imprima en una nueva línea.

usuario3763437
fuente
1
//, Esto realmente hizo que no imprimiera nada. ¿No necesitamos agregar otra declaración de impresión sin un argumento al final, como se muestra en stackoverflow.com/a/493500/2146138 ? ¿Estaría dispuesto a editar esta respuesta con un ejemplo realmente corto de dos o tres líneas?
Nathan Basanese
3
El OP no quiere un espacio agregado
pppery
2
No respondí la pregunta. No hay espacios.
musaraña
Esto ya no funciona en Python 2.xy solo responde la mitad de lo que el OP quería. ¿Por qué 16 votos a favor?
TheTechRobo36414519
12

En Python 3+, printes una función. Cuando usted llama

print('hello world')

Python lo traduce a

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

Puedes cambiar enda lo que quieras.

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

Python 2.6+ :

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

pitón 3 :

print('.', end='')

python <= 2.5 :

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

si el espacio adicional está bien después de cada impresión, en python 2

print '.',

engañoso en 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
fuente
8

Puedes probar:

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
fuente
5

Puede hacer lo mismo en python3 de la siguiente manera:

#!usr/bin/python

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

y ejecutarlo con python filename.pyopython3 filename.py

Subbu
fuente
5

recientemente tuve el mismo problema..

Lo resolví haciendo:

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)

esto funciona tanto en Unix como en Windows ... no lo he probado en macosx ...

hth

ssgam
fuente
2
Saltossys.__stdout__
pppery
4

@lenooh satisfizo mi consulta. Descubrí este artículo mientras buscaba 'python suprimir nueva línea'. Estoy usando IDLE3 en Raspberry Pi para desarrollar Python 3.2 para PuTTY. Quería crear una barra de progreso en la línea de comando PuTTY. No quería que la página se desplazara. Quería una línea horizontal para asegurarle al usuario que se volviera loco de que el programa no se ha detenido ni se ha enviado a almorzar en un alegre bucle infinito, como una súplica para que me deje, lo estoy haciendo bien, pero esto puede llevar algo de tiempo. mensaje interactivo: como una barra de progreso en el texto.

El print('Skimming for', search_string, '\b! .001', end='')inicializa el mensaje mediante la preparación para la siguiente pantalla-escritura, que imprimirá tres teclas de retroceso como ⌫⌫⌫ rubout y después de un período, limpiando off '001' y que se extiende la línea de períodos. Después de search_stringla entrada del usuario de los loros, \b!recorta el signo de exclamación de mi search_stringtexto para retroceder sobre el espacio que de print()otro modo fuerza, colocando correctamente la puntuación. Eso es seguido por un espacio y el primer 'punto' de la 'barra de progreso' que estoy simulando. Innecesariamente, el mensaje también se imprime con el número de página (formateado en una longitud de tres con ceros a la izquierda) para que el usuario tenga en cuenta que el progreso se está procesando y que también reflejará el recuento de períodos que luego desarrollaremos en el Derecha.

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')

La barra de progreso carne está en la sys.stdout.write('\b\b\b.'+format(page, '03'))línea. Primero, para borrar a la izquierda, hace una copia de seguridad del cursor sobre los tres caracteres numéricos con el '\ b \ b \ b' como ⌫⌫⌫ rubout y suelta un nuevo punto para agregar a la longitud de la barra de progreso. Luego escribe tres dígitos de la página que ha progresado hasta ahora. Como sys.stdout.write()espera a que se cierre un búfer completo o que se cierre el canal de salida, sys.stdout.flush()fuerza la escritura inmediata. sys.stdout.flush()está integrado en el final del print()cual se pasa por alto print(txt, end='' ). Luego, el código recorre sus operaciones intensivas de tiempo mundano mientras no imprime nada más hasta que vuelve aquí para borrar tres dígitos, agregar un punto y escribir tres dígitos nuevamente, incrementado.

Los tres dígitos borrados y reescritos no son de ninguna manera necesarios, es solo una floritura que ejemplifica sys.stdout.write()versus print(). Podrías cebar fácilmente con un punto y olvidarte de los tres sofisticados espacios de barra invertida-b ⌫ (por supuesto, no escribir también los recuentos de páginas formateadas) simplemente imprimiendo la barra de períodos más de una en una cada vez, sin espacios ni líneas nuevas usando solo el sys.stdout.write('.'); sys.stdout.flush()par.

Tenga en cuenta que el shell Python de Raspberry Pi IDLE3 no respeta el espacio de retroceso como ⌫ rubout, sino que imprime un espacio, creando en su lugar una lista aparente de fracciones.

- (o = 8> wiz

DisneyWizard
fuente
4

Notará que todas las respuestas anteriores son correctas. Pero quería hacer un atajo para escribir siempre el parámetro "end = ''" al final.

Podrías definir una función como

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

Aceptaría toda la cantidad de parámetros. Incluso aceptará todos los demás parámetros como archivo, vaciado, etc. y con el mismo nombre.

Bikram Kumar
fuente
No se ejecuta, se queja de que *argestá al principio (python 2.7), y ponerlo al final se ejecutó, pero no funcionó completamente bien. Definí una función que solo tomó Print(*args), y luego simplemente llamé imprimir con sep='', end=''. Y ahora funciona como quiero. Entonces uno votó por la idea.
Otzen
4

Muchas de estas respuestas parecen un poco complicadas. En Python 3.x simplemente haces esto:

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

El valor predeterminado de end es "\n". Simplemente lo estamos cambiando a un espacio o también puede usar end=""(sin espacio) para hacer lo que printfnormalmente hace.

jarr
fuente
3

desea imprimir algo en el bucle correcto, pero no quiere que se imprima en una nueva línea cada vez ... por ejemplo:

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

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

pero quieres que se imprima de esta manera: hola hola hola hola hola ¿verdad ???? simplemente agregue una coma después de imprimir "hola"

Ejemplo:

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

Bala.K
fuente
55
No, el OP quiere hihihihihi, no hola hola hola hola
Cool Javelin
1

O tener una función como:

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

Entonces ahora:

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

Salidas:

0123456789
U10-Adelante
fuente
0
for i in xrange(0,10): print '\b.',

Esto funcionó tanto en 2.7.8 como en 2.5.2 (Canopy y terminal OSX, respectivamente): no se requieren importaciones de módulos ni viajes en el tiempo.

tyersome
fuente
8
Eso imprime caracteres de retroceso a la salida estándar. Puede parecer correcto si la salida estándar resulta ser una terminal, pero si se redirige a un archivo ese archivo contendrá caracteres de control.
Keith Thompson el
1
Es cierto, pero no puedo imaginar que alguien quiera usar esto para algo que no sea una barra de progreso de baja tecnología ...
tyersome
1
Sin embargo, el código Python no hace lo mismo que el código C en la pregunta.
Keith Thompson
puede probar sys.stdout.isatty()si no se redirige a un archivo.
fcm
0

Hay dos formas generales de hacer esto:

Imprimir sin nueva línea en Python 3.x

No agregue nada después de la declaración de impresión y elimine '\ 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

Otro ejemplo en bucle :

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

Imprimir sin nueva línea en Python 2.x

Agregar una coma final dice que después de imprimir ignore \n.

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

Otro ejemplo en bucle :

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

Espero que esto te ayudará. Puedes visitar este enlace .

susan097
fuente
¿Qué hay del espacio?
musaraña
utilice, end=" "por ejemplo: print ('hello', end = '' "); print ('world')
susan097
Su solución 2.7 no elimina el espacio.
musaraña
Menciono que eliminar '\ n' no espacio, el espacio está por defecto en python2. Vea cómo se ve esto: print 'hello' ;print'there'en paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097
Correcto, es por eso que su respuesta fue rechazada. No respondió la pregunta "¿Cómo imprimir sin nueva línea o espacio?". Su respuesta para 2.x no responde la pregunta. Su respuesta para 3.0 es la misma que muchas de las otras respuestas que se publicaron hace más de nueve años. En pocas palabras, esta respuesta no agrega nada útil a la comunidad y debe eliminarla.
musaraña
-3

... no necesita importar ninguna biblioteca. Solo usa el caracter de borrar:

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

Esto elimina la nueva línea y el espacio (^ _ ^) *

mchrgr2000
fuente