2010-08-05 15 views
43

Fondamentalmente voglio fare l'opposto di quello che ha fatto questo ragazzo ... hehe.Stampa sulla stessa riga e non su una nuova riga in python

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

Ho un programma che mi sta dicendo a che punto è.

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

Quindi se len (some_list) era 50, avrei ottenuto quell'ultima riga stampata 50 volte. Voglio stampare una riga e continuare ad aggiornare quella linea. So che so che questa è probabilmente la domanda più debole che leggerai tutto il giorno. Non riesco a capire le quattro parole che devo inserire su google per ottenere la risposta.

Aggiornamento

! Ho provato il suggerimento di mvds che sembrava giusto. Il nuovo codice

print percent_complete,"   \r", 

percentuale completa è solo una stringa (stavo astraendo la prima volta ora un cercando di essere letterale). Il risultato ora è che esegue il programma, non stampa NULLA fino a dopo che il programma è finito, e quindi stampa "100% completo" su una sola riga.

Senza il ritorno a capo (ma con la virgola, metà del suggerimento del mvds) non stampa nulla fino alla fine. E poi stampa:

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

E così via. Quindi ora il nuovo problema è che con la virgola non viene stampata fino al termine del programma.

Con il ritorno a capo e nessuna virgola si comporta esattamente come con nessuno dei due.

+0

Si potrebbe anche voler controllare 'sys.stdout.isatty()' in modo da non sputare queste cose quando non sono in esecuzione in un terminale. – mvds

+0

Lo sto facendo da un terminale ... un buon pensiero però. Sono sicuro che ne avrò bisogno ad un certo punto. – chriscauley

+1

lo sfondo è, btw, che in diverse lingue il \ n (che ora omettiamo) serve come segnale implicito per il flush allo stdout. Altrimenti molte persone saranno confuse. – mvds

risposta

66

Si chiama il ritorno a capo, o \r

Usa

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

La virgola impedisce di stampa di aggiungere una nuova riga. (e gli spazi manterranno la linea libera dall'output precedente)

Inoltre, non dimenticare di terminare con uno print "" per ottenere almeno una riga finale di finalizzazione!

+6

Assicurati di stampare sempre la stessa quantità di dati (o più di qualsiasi altra stampa precedente) sulla linea, altrimenti alla fine ti ritroverai con cruft. –

+1

+1 davvero un buon punto, risolverà – mvds

+0

Così vicino ... aggiornerò la domanda con il risultato di questo. – chriscauley

0

Prova in questo modo: (. Con una virgola alla fine)

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

+0

Questo aggiunge il nuovo testo al vecchio (funzionalmente simile ma brutto). – chriscauley

2

Questo funziona per me, hacked una volta per vedere se è possibile, ma mai effettivamente utilizzati nel mio programma (GUI è quindi molto di più):

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

da Python 3.x si può fare:

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

(che può essere utilizzato anche in Python 2.6 o 2.7 mettendo from __future__ import print_function nella parte superiore del vostro script/modulo) console

Python progressbar esempio:

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

\ r sembra aggiungere anche una nuova riga – fccoelho

9

per console avrete probabilmente bisogno

sys.stdout.flush() 

per forzare l'aggiornamento. Penso che utilizzando , in stampa bloccherà stdout da vampate di calore e in qualche modo non aggiornerà

+0

Terminator stava aggiornando la linea ogni 30 secondi quando si utilizza print ("...", end = '\ r') per me a meno che non avessi eseguito questo comando subito dopo la stampa dichiarazione. Grazie –

8

Per me, quello che ha funzionato è stata una combinazione di Remi e di risposte di 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 sposta il posizione del cursore indietro di uno spazio
Quindi lo spostiamo indietro fino all'inizio della riga
Scriviamo quindi degli spazi per cancellare la riga corrente - mentre scriviamo gli spazi il cursore si sposta avanti/destra di uno
Allora dobbiamo riportare il cursore all'inizio della linea prima che scriviamo i nostri nuovi dati

testati su cmd Windows utilizzando Python 2.7

0

Sulla base Remi answer per Python 2.7+ uso questo:

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) 
Problemi correlati