2009-08-21 4 views
1

Ich habe ein Skript, das eine einfache verwendet while-Schleife ein Fortschrittsbalken angezeigt werden, aber es scheint nicht zu funktionieren, wie ich erwartet hatte:Hilfe mit Python while-Schleife Verhalten

count = 1 
maxrecords = len(international) 
p = ProgressBar("Blue") 
t = time 
while count < maxrecords: 
    print 'Processing %d of %d' % (count, maxrecords) 
    percent = float(count)/float(maxrecords) * 100 
    p.render(int(percent)) 
    t.sleep(0.5) 
    count += 1 

Es scheint bei Looping zu werden "p.render ..." und geht nicht zurück zu "print" Processing% d von% d ... '".

UPDATE: Entschuldigung. Es scheint, dass ProgressBar.render() die Ausgabe von "print" Processing ... entfernt, wenn es den Fortschrittsbalken rendert. Der Fortschrittsbalken ist von

+0

ersetzen Wollen Sie damit sagen der Wert der Zählung ändert sich nicht? –

Antwort

2

Was ist die Implementierung für ProgressBar.render()? Ich nehme an, dass es Terminalsteuerzeichen ausgibt, die den Cursor so bewegen, dass die vorherige Ausgabe überschrieben wird. Dies kann den falschen Eindruck erwecken, dass der Kontrollfluss nicht so funktioniert, wie er sein sollte.

+0

Hier ist der Ausgang: Die Verarbeitung 1 von 17909 0% 0% 0% 0% 0% 0% 0% – Francis

+1

Die ProgressBar ist von http://nadiana.com/animated-terminal-progress-bar-in-python – Francis

3

Das ist nicht die Art, eine Schleife in Python zu schreiben.

maxrecords = len(international) 
p = ProgressBar("Blue") 
for count in range(1, maxrecords): 
    print 'Processing %d of %d' % (count, maxrecords) 
    percent = float(count)/float(maxrecords) * 100 
    p.render(int(percent)) 
    time.sleep(0.5) 

Wenn Sie tatsächlich etwas mit dem Datensatz tun wollen, anstatt nur die Bar zu machen, würden Sie dies tun:

maxrecords = len(international) 
for count, record in enumerate(international): 
    print 'Processing %d of %d' % (count, maxrecords) 
    percent = float(count)/float(maxrecords) * 100 
    p.render(int(percent)) 
    process_record(record) # or whatever the function is 
+1

Benutzer werden nicht glücklich sein mit "Verarbeitung 0 von 100" :-) –

+0

Danke für die schnelle Antwort. Ich habe Ihren ersten Vorschlag ausprobiert, aber es geht immer noch nicht zurück zur Zeile "Drucken". Es ist in der Zeile "p.render ..." stecken geblieben. – Francis

+1

Es ist nicht "fest" @Francis. Bitte geben Sie den Rest des Codes in Ihrer Frage an. –

5

Ich sehe Sie verwenden die ProgressBar-Implementierung auf meiner Website. Wenn Sie eine Nachricht drucken möchten Sie die Nachricht Argument verwenden können in machen

p.render(percent, message='Processing %d of %d' % (count, maxrecords)) 
+1

Danke für die ProgressBar;) – Francis

+1

Bitte lassen Sie mich wissen, wenn Sie einen Fehler finden. Ich werde mehr als glücklich sein, es zu beheben. –

+0

Funktioniert perfekt. Danke für den Tipp! – Francis

1

(1) [nicht Teil des Problems, aber ...] t = time gefolgt viel später von t.sleep(0.5) würde ein Ärgernis sein, jemand, der das bloße t sieht und rückwärts lesen muss, um zu finden, was es ist.

(2) [nicht Teil des Problems, aber ...] count kann nie die Schleife mit dem gleichen Wert wie maxrecords eingeben. Z.B. Wenn maxrecords 10 ist, wird der Code in der Schleife nur 9 Mal ausgeführt.

(3) Es gibt nichts in dem Code, den Sie gezeigt haben, der die Idee unterstützen würde, "p.render()" zu loopen - es sei denn, die Rendermethode selbst loopt, wenn ihr Argument null ist der Fall, wenn maxrecords ist 17909. Versuchen Sie, die p.render (....) vorübergehend mit (sagen wir)

print "pretend-render: pct =", int(percent)

+0

Danke für die Rückmeldung. Ich verstehe deinen Standpunkt zu # 2. In der Tat wird die Schleife nicht bis 'Maxrecords' verarbeitet - sie ist immer kleiner als 1 – Francis