2010-08-05 34 views
43

Básicamente quiero hacer lo contrario de lo que hizo este tipo ... jeje.Imprimir en la misma línea y no en una nueva línea en python

Python Script: Print new line each time to shell rather than update existing line

que tienen un programa que me está diciendo qué tan avanzado está.

for i in some_list: 
    #do a bunch of stuff. 
    print i/len(some_list)*100," percent complete" 

Así que si len (some_list) fuera 50, obtendría la última línea impresa 50 veces más. Quiero imprimir una línea y seguir actualizando esa línea. Sé que sé que esta es probablemente la pregunta más difícil que leerás todo el día. Simplemente no puedo entender las cuatro palabras que necesito poner en google para obtener la respuesta.

¡Actualización! Intenté la sugerencia de mvds que parecía correcta. El nuevo código

print percent_complete,"   \r", 

Porcentaje completa es sólo una cadena (que estaba haciendo abstracción primera vez ahora tratando de ser un literal). El resultado ahora es que ejecuta el programa, no imprime NADA hasta que el programa termina, y luego imprime "100 por ciento completo" en una y solo una línea.

Sin el retorno de carro (pero con la coma, la mitad de la sugerencia de mvds) no imprime nada hasta el final. Y luego imprime:

0 percent complete  2 percent complete  3 percent complete  4 percent complete  

Y así sucesivamente. Entonces, ahora el nuevo problema es que con la coma no se imprime hasta que el programa finaliza.

Con el retorno de carro y sin coma, se comporta exactamente igual que con ninguno de los dos.

+0

Es posible que también desee comprobar 'sys.stdout.isatty()' por lo que no escupir estas cosas cuando no se ejecuta en un terminal. – mvds

+0

Estoy ejecutando esto desde una terminal ... aunque es una buena idea. Estoy seguro de que lo necesitaré en algún momento. – chriscauley

+1

el fondo es, por cierto, que en varios idiomas el \ n (que ahora omite) sirve como una señal implícita para descargar a stdout. De lo contrario, mucha gente se confundirá. – mvds

Respuesta

66

Se llama el retorno de carro, o \r

Uso

print i/len(some_list)*100," percent complete   \r", 

La coma evita la impresión de la adición de una nueva línea. (y los espacios mantendrán la línea libre de la salida anterior)

Además, no olvide terminar con print "" para obtener al menos una nueva línea de finalización.

+6

Simplemente asegúrese de imprimir siempre la misma cantidad de datos (o más que cualquier impresión anterior) en la línea, de lo contrario terminará con crumble al final. –

+1

+1 punto realmente bueno, arreglará – mvds

+0

Tan cerca ... Voy a actualizar la pregunta con el resultado de esto. – chriscauley

0

Trate de esta manera: (. Con una coma al final)

for i in some_list: 
    #do a bunch of stuff. 
    print i/len(some_list)*100," percent complete", 

+0

Esto simplemente agrega el nuevo texto al anterior (funcionalmente similar pero feo). – chriscauley

2

Esto funciona para mí, cortado una vez para ver si es posible, pero en realidad nunca utilizó en mi programa de usuario (GUI es mucho mejor):

import time 
f = '%4i %%' 
len_to_clear = len(f)+1 
clear = '\x08'* len_to_clear 
print 'Progress in percent:'+' '*(len_to_clear), 
for i in range(123): 
    print clear+f % (i*100//123), 
    time.sleep(0.4) 
raw_input('\nDone') 
18

De 3.x pitón que puede hacer:

print('bla bla', end='') 

(que también se puede usar en Python 2.6 o 2.7 poniendo from __future__ import print_function en la parte superior de su script/módulo) de la consola

Python progressbar ejemplo:

import time 

# status generator 
def range_with_status(total): 
    """ iterate from 0 to total and show progress in console """ 
    n=0 
    while n<total: 
     done = '#'*(n+1) 
     todo = '-'*(total-n-1) 
     s = '<{0}>'.format(done+todo) 
     if not todo: 
      s+='\n'   
     if n>0: 
      s = '\r'+s 
     print(s, end='') 
     yield n 
     n+=1 

# example for use of status generator 
for i in range_with_status(10): 
    time.sleep(0.1) 
+0

Parece que también agrega una nueva línea – fccoelho

9

para la consola es probable que tengas

sys.stdout.flush() 

para forzar la actualización. Creo que el uso de , en la impresión bloqueará la salida estándar de lavado y de alguna manera no se actualizará

+0

Terminator solo estaba refrescando la línea cada 30 segundos cuando usé print ("...", end = '\ r') para mí a menos que ejecutara este comando inmediatamente después de la impresión declaración. Gracias –

8

Para mí, lo que funcionó fue un combo de Remi y respuestas de siriusd:

from __future__ import print_function 
import sys 

print(str, end='\r') 
sys.stdout.flush() 
0
import time 
import sys 


def update_pct(w_str): 
    w_str = str(w_str) 
    sys.stdout.write("\b" * len(w_str)) 
    sys.stdout.write(" " * len(w_str)) 
    sys.stdout.write("\b" * len(w_str)) 
    sys.stdout.write(w_str) 
    sys.stdout.flush() 

for pct in range(0, 101): 
    update_pct("{n}%".format(n=str(pct))) 
    time.sleep(0.1) 

\b moverá la ubicación del cursor hacia atrás un espacio
Así que lo movemos hacia atrás hasta el comienzo de la línea
Luego escribimos espacios para borrar la línea actual - a medida que escribimos espacios, el cursor se mueve hacia adelante/derecha por uno
Así entonces tenemos que mover el cursor hacia atrás al comienzo de la línea antes de que escribimos nuestros nuevos datos

probado en cmd de Windows utilizando Python 2.7

0

Basado en Remi answer para Python 2.7+ uso esto:

from __future__ import print_function 
import time 

# status generator 
def range_with_status(total): 
    """ iterate from 0 to total and show progress in console """ 
    import sys 
    n = 0 
    while n < total: 
     done = '#' * (n + 1) 
     todo = '-' * (total - n - 1) 
     s = '<{0}>'.format(done + todo) 
     if not todo: 
      s += '\n' 
     if n > 0: 
      s = '\r' + s 
     print(s, end='\r') 
     sys.stdout.flush() 
     yield n 
     n += 1 


# example for use of status generator 
for i in range_with_status(50): 
    time.sleep(0.2) 
Cuestiones relacionadas