2010-04-22 8 views
5

Mein Python-Programm macht eine Reihe von Dingen und druckt einige Diagnoseausgaben. Ich möchte auch einen Fortschrittszähler wie folgt haben:Wie simuliere ich einen Fortschrittszähler in einer Befehlszeilenanwendung in Python?

Percentage done: 25% 

wo die Zahl "an Ort und Stelle" erhöht. Wenn ich nur Zeichenfolgenanweisungen verwende, kann ich separate Zahlen schreiben, aber das würde den Bildschirm überladen. Gibt es einen Weg, dies zu erreichen, zum Beispiel mit einem Escape-Zeichen für die Rücktaste, um eine Zahl zu löschen und die nächste zu schreiben?

Dank

+0

es ist plattformabhängig –

+0

möglich Duplikat http://stackoverflow.com/questions/60221/how-to-animate-the-command-line – SilentGhost

Antwort

7

Hier ist ein Beispiel-Datei lesen Prozentsatz für die Ansicht:

from sys import * 
import os 
import time 

Size=os.stat(argv[1])[6] #file size 

f=open(argv[1],"r"); 
READED_BYTES=0 

for line in open(argv[1]): #Read every line from the file 
     READED_BYTES+=len(line) 
     done=str(int((float(READED_BYTES)/Size)*100)) 
     stdout.write(" File read percentage: %s%%  %s"%(done,"\r")) 
     stdout.flush(); 
     time.sleep(1) 
4

Lösung des armen Mannes:

import time 
    for i in range(10): 
    print "\r", i, 
    time.sleep(1) 

Der Trick ist die Druckanweisung. Der Wagenrücklauf ("\ r") setzt den Cursor zurück auf die erste Spalte derselben Zeile, ohne eine neue Zeile zu beginnen. Das nachgestellte Komma "," sagt dem Drucker, dass er auch keinen Zeilenumbruch erzeugen soll.

Abhängig von Ihrer Ausgabe sollten Sie die print-Anweisung mit abschließenden Leerzeichen auffüllen, um sicherzustellen, dass Fragmente aus längeren vorherigen Zeilen Ihre aktuelle Druckanweisung nicht beeinträchtigen. Es ist wahrscheinlich am besten, eine Zeichenfolge zu erstellen, die eine feste Länge für jede Fortschrittsinformation hat.

+1

zoli2k richtig ist. Sie sollten stdout.flush() aufrufen, um ein Echtzeit-Lesen zu erhalten. – Bernd

0

Hier ist eine wirklich einfache Progress Bar-Klasse, die die meisten von dem, was kapselt Sie mit einem CLI Fortschrittsbalken tun wollen würde (ohne Balken).

class ProgressBar(object): 
    def __init__(self, total=100, stream=sys.stderr): 
     self.total = total 
     self.stream = stream 
     self.last_len = 0 
     self.curr = 0 

    def count(self): 
     self.curr += 1 
     self.print_progress(self.curr) 

    def print_progress(self, value): 
     self.stream.write('\b' * self.last_len) 
     pct = 100 * self.curr/self.total 
     out = '{:.2f}% [{}/{}]'.format(pct, self.curr, self.total) 
     self.last_len = len(out) 
     self.stream.write(out) 
     self.stream.flush() 

z.

>>> p = ProgressBar(1000) 
>>> p.print_progress(500) 
50% [500/1000] 
Verwandte Themen