2016-12-12 3 views
0

Ich möchte die Python-Modul Progressbar verwenden.Python Progressbar Aktualisierung?

In meinem Fall möchte ich nach einem Wort in einer großen Liste suchen. Das funktioniert. Also dachte ich, eine Fortschrittsleiste wäre nett. Ich importierte das Modul und versucht es aus:

path = str(raw_input(PATH)) 
word = str(raw_input(WORD)) 
widgets = ['Suche Wort: ', pb.Percentage(), ' ', 
      pb.Bar(marker=pb.RotatingMarker()), ' ', pb.ETA()] 
timer = pb.ProgressBar(widgets=widgets, maxval=10).start() 
loc = -1 

with open(path) as f: 
    for n in range(0,10): 
     timer.update(n) 
     for i, line in enumerate(f): 
      if word in line: 
       timer.update(n) 
       loc = i 
       break 
    timer.finish() 

Aber es gibt ein Problem .. die progressbar bei 0% hält .Wenn die ganze Schleife beendet ist, es zu 100% springt. Warum?! Ich verstehe es nicht.

Vielen Dank im Voraus :)!

Antwort

0

Ich vermute, dass Sie versuchen, den Timer um 10% zu erhöhen. Sie haben jedoch einen kleinen Fehler. Die Reihenfolge zwischen dem Lesen von f und dem Aktualisieren des Timers.

with open(path) as f: 
    for n in range(0,10): 
     timer.update(n) 
     for i, line in enumerate(f): 
      ... 
    timer.finish() 

Das erste Mal, wenn die Schleife läuft, rufen Sie timer.update(0). Dann lesen Sie alle Elemente aus der Datei. Tatsächlich beginnen Sie an der aktuellen Position in der Datei und lesen Zeile für Zeile, bis keine Zeilen mehr in der Datei sind.

Die nächste Iteration, aktualisieren Sie den Fortschrittsbalken: timer.update(1). Dann lesen Sie alle Elemente aus der Datei und beginnen dort, wo der Dateideskriptor zeigt, d. H. Bei das Ende der Datei. Das Lesen vom Ende der Datei bis zum Ende der Datei dauert keine Zeit, so dass Sie timer.update(2) in kürzester Zeit den ganzen Weg bis zum Ende aufrufen.

Sie haben 10 Schritte für Ihre Fortschrittsbalken willkürlich gewählt, die ich vermute, ist auf die Anzahl der Zeilen in f nicht verwandt. Wenn Sie die Anzahl der Zeilen in f kennen, können Sie aktualisieren nur die Fortschrittsbalken auf jeder Iteration oder alle 1000 Iterationen (if i % 1000 == 0:). Wenn Sie nicht tun, werden Sie herausfinden, wie viele Bytes Sie bisher gelesen habe (zB durch die Länge der Linien Zählen Sie lesen), und sehen, wie groß die Datei ist, und verwenden Sie diese Zahlen als die Grundlage für Ihre Fortschrittsanzeige.