¿Cómo puedo imprimir varias cosas en la misma línea, una a la vez?

6 minutos de lectura

avatar de usuario de user697108
usuario697108

Quiero ejecutar un script, que básicamente muestra un resultado como este:

Installing XXX...               [DONE]

Actualmente imprimo Installing XXX... primero y luego imprimo [DONE].

¿Cómo puedo imprimir en su lugar Installing xxx... y [DONE] en la misma linea?


Para el problema específico de escribir un nuevo mensaje en la misma línea, reemplazando lo que había antesconsulte ¿Cómo sobrescribir la impresión anterior en la salida estándar?. Mayoría Las respuestas aquí interpretaron la pregunta como si se tratara de escribir un nuevo texto. al final de la línea actual.

Para el problema de usar un solo print para generar varias cosas a la vez, consulte ¿Cómo puedo imprimir varias cosas (texto fijo y/o valores variables) en la misma línea, todas a la vez?.

  • Posible duplicado de ¿Cómo evito que la impresión de Python agregue nuevas líneas o espacios?

    – Cees Timmermann

    9 de diciembre de 2016 a las 2:21

  • Las respuestas a esta pregunta no mencionan que a veces desea borrar la línea, consulte: stackoverflow.com/questions/45263205

    – ideasman42

    23 de julio de 2017 a las 9:44

avatar de usuario de multipleinterfaces
múltiples interfaces

Solución Python 3

Él print() La función acepta una end parámetro que por defecto es \n (nueva línea). Establecerlo en una cadena vacía evita que emita una nueva línea al final de la línea.

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

Solución Python 2

Poniendo una coma al final del print() línea previene print() de emitir una nueva línea (debe tener en cuenta que habrá un espacio adicional al final de la salida).

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

  • Funciona perfectamente. Solo había visto soluciones estándar hasta ahora. Realmente bueno saber eso.

    – Prometeo

    8 de enero de 2015 a las 7:59

  • Esto no funciona si tiene ambas impresiones y una acción que consume mucho tiempo en el medio (todo en la misma función/nivel de sangría). Antes de que comience la acción, no hay ningún resultado y, una vez finalizada, el resultado aparece completo.

    – Padre

    20 de febrero de 2015 a las 15:08

  • Probablemente sea más una función del almacenamiento en búfer de salida realizado por el sistema operativo para el proceso en su conjunto, que no es un problema específico de Python. Consulte stackoverflow.com/questions/107705 para obtener una solución alternativa específica de Python.

    – múltiples interfaces

    20 de febrero de 2015 a las 16:48


  • Sin una nueva línea, probablemente desee vaciar explícitamente el búfer. Utilizar print("...", end="", flush=True) en Python 3, en Python 2 agregue un sys.stdout.flush() llamada.

    – Martijn Pieters

    3 de noviembre de 2016 a las 12:53

  • en python 3.x, querrá agregar un “\ r” al final para reemplazar la línea impresa VS que se agrega al final de la misma print("Progress: {}%".format(var), end="\r", flush=True)

    – John

    06/01/2018 a las 22:42

avatar de usuario de boldnik
audaz

Simplemente puede usar esto:

print 'something',
...
print ' else',

y la salida será

something else

no hay necesidad de exagerar por import sys. Preste atención al símbolo de coma al final.

Pitón 3+
print("some string", end=""); para eliminar la inserción de nueva línea al final. Leer más por help(print);

  • Tenga en cuenta que hay dos espacios al usar este método

    – ethanjyx

    12 de noviembre de 2013 a las 3:20

  • Esta es la respuesta más simple y eficiente.

    – gixxer

    22 de mayo de 2015 a las 4:45

  • Esto no funciona cuando los argumentos de impresión están entre paréntesis. Esto funciona: pero esto no funciona

    –Mayank Jaiswal

    27 de noviembre de 2015 a las 7:46

  • @MayankJaiswal Esto funciona con los padres. imprimir(‘hola’),

    – drglove

    06/02/2016 a las 22:39

  • print La función tiene una sintaxis ligeramente diferente en Python 2 VS 3.

    – boldnik

    7 de febrero de 2016 a las 4:24

Avatar de usuario de Vadim Zin4uk
vadim zin4uk

Deberías usar retroceso ‘\r‘ o (‘\x08‘) char para volver a la posición anterior en la salida de la consola

Pitón 2+:

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

Pitón 3:

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

Este código contará del 0% al 100% en una línea. El valor final será:

> python test.py
100%

Información adicional sobre el vaciado en este caso aquí: ¿Por qué las declaraciones de impresión de Python que contienen argumentos ‘end=’ se comportan de manera diferente en los bucles while?

  • Para aclarar, parece que el código comentado en este ejemplo es para Python 2 y las líneas sin comentarios son para Python 3.

    – Las tortugas son lindas

    09/03/2015 a las 23:05

  • Ambas líneas funcionarán bien en Python 3. Si usa ‘\x08′ como retroceso, debe vaciar el flujo de salida: print((b’\x08’ * n).decode(), end=”, flush= Verdadero)

    – Vadim Zin4uk

    10 de marzo de 2015 a las 9:43


  • El retorno de carro ‘\r’ vuelve al principio de la línea, por lo que el ‘* n’ es innecesario

    – bjnortier

    8 de mayo de 2017 a las 8:02


avatar de usuario de ferostar
ferostar

Utilizar sys.stdout.write('Installing XXX... ') y sys.stdout.write('Done'). De esta manera, debe agregar la nueva línea a mano con "\n" si desea recrear la funcionalidad de impresión. Creo que podría ser innecesario usar maldiciones solo para esto.

Avatar de usuario de Sunfloro
Sunfloro

Más sencillo:

Pitón 3

    print('\r' + 'something to be override', end='')

Significa que hará retroceder el cursor al principio, que imprimirá algo y terminará en la misma línea. Si está en un bucle, comenzará a imprimir en el mismo lugar donde comienza.

  • ¡Fresco! Funciona en Windows también.

    – Shital Shah

    13 de febrero de 2019 a las 11:59

  • Gracias esto funciona bien para mí! pienso que print(’something to be override’, end=‘\r’) aunque es más simple.

    – Tropilio

    10 de abril de 2019 a las 9:00

avatar de usuario de hyprnick
hipnótico

Ninguna de las respuestas funcionó para mí, ya que todas se detuvieron hasta que se encontró una nueva línea. Escribí un ayudante simple:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

Para probarlo:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

“hola” primero se imprimirá y aparecerá en la pantalla antes de dormir. Después de eso, puede usar la impresión estándar.

  • ¡Fresco! Funciona en Windows también.

    – Shital Shah

    13 de febrero de 2019 a las 11:59

  • Gracias esto funciona bien para mí! pienso que print(’something to be override’, end=‘\r’) aunque es más simple.

    – Tropilio

    10 de abril de 2019 a las 9:00

Avatar de usuario de John Giotta
Juan Giotta

sys.stdout.write imprimirá sin carro de retorno

import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")

http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines

¿Ha sido útil esta solución?