2012-03-25 7 views
11

come si sovrascrive la stampa precedente in python 2.7? Sto facendo un semplice programma per calcolare pi. questo è il codice:python sovrascrive la riga precedente

o = 0 
hpi = 1.0 
i = 1 
print "pi calculator" 
acc= int(raw_input("enter accuracy:")) 
if(acc>999999): 
     print "WARNING: this might take a VERY long time. to terminate, press CTRL+Z" 
print "precision: " + str(acc) 
while i < acc: 
     if(o==0): 
       hpi *= (1.0+i)/i 
       o = 1 
     elif(o==1): 
       hpi *= i/(1.0+i) 
       o = 0 
     else: 
       print "loop error." 
     i += 1 
     if i % 100000 == 0: 
       print str(hpi*2)) 
print str(hpi*2)) 

Esegue in modo semplice la corrente pi dopo 100.000 calcoli. come posso farlo sovrascrivere il calcolo precedente?

risposta

19

Prefix l'output con il simbolo di ritorno a capo '\r' e non terminarlo con il simbolo di avanzamento riga '\n'. Questo posizionerà il cursore all'inizio della riga corrente, quindi l'output sovrascriverà il suo contenuto precedente. Ricoprilo con uno spazio bianco finale per garantire la sovrascrittura. Per esempio.

sys.stdout.write('\r' + str(hpi) + ' ' * 20) 
sys.stdout.flush() # important 

Emettere il valore finale come al solito con print.

Credo che questo dovrebbe funzionare sia nella maggior parte degli emulatori di terminale * nix che nella console di Windows. YMMV, ma questo è il modo più semplice.

+1

Su alcune piattaforme ' '\ r'' solo 'cancella' un carattere (effetto simile ad un tasto backspace), quindi in questo caso sarebbe necessario né rintracciare grande è la vostra ultima linea era e che molti anteporre '\ r' caratteri nella tua prossima riga, o più semplicemente hanno sempre un output di lunghezza fissa riempito (ad esempio usando 'str.rjust (...)') –

+0

thx, è proprio quello di cui ho bisogno. – Cinder

4

Check out this answer. Fondamentalmente, \r funziona correttamente, ma è necessario assicurarsi di stampare senza i caratteri di nuova riga.

cnt = 0 
print str(cnt) 
while True: 
    cnt += 1 
    print "\r" + str(cnt) 

Questo non funzionerà perché si stampa una nuova linea ogni volta, e \r va solo indietro alla nuova riga precedente.

L'aggiunta di una virgola alla dichiarazione print impedirà la stampa di una nuova riga, pertanto \b tornerà all'inizio della riga appena scritta e sarà possibile sovrascriverla.

cnt = 0 
print str(cnt), 
while True: 
    cnt += 1 
    print "\r" + str(cnt),