English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Das Hauptproblem des Fortschrittsbalkens ist, dass alle Zeichen auf einer Zeile stehen und geändert werden können.
Allerdings fügt Python, wenn er einen print-Ausdruck ausführt, gleichzeitig ein '\n' am Ende hinzu, was bedeutet, dass man nach dem print im Terminal nicht mehr ändern kann. Daher kann die aktuelle Ausgabe nicht mehr mit print abgeschlossen werden.
Wir verwenden die Funktion sys.stdout.write() aus dem sys-Bibliothek, diese Funktion gibt die Zeichenkette gleichzeitig im Console aus und fügt keine Endung hinzu, was bedeutet, dass die Ausgabe noch nicht vollständig abgeschlossen ist. Durch die Funktion sys.stdout.flush() kann die Ausgabe vorübergehend im Console gedruckt werden (schafft den Eindruck von print, wir nennen es vorläufiges Drucken). Also, wenn wir den Escape-Zeichen (zurück zum Anfang der Zeile) verwenden, scheint alles viel plausibler zu sein?
Das bedeutet also: Wenn man eine Zeichenkette druckt, fügt man keine '\n' hinzu und kehrt den Cursor zurück zum Anfang der Zeile, zeigt dann den aktuellen Puffer an, das scheint so auszusehen, als würde man print machen, aber der Cursor ist noch an der ursprünglichen Position.
Ein Beispiel
[Getestet hat gezeigt, dass dies nur im Linux-Terminal funktioniert, die Ausgabe der Debugging in PyCharm hat keine Wirkung]
import sys, time for i in range(5) sys.stdout.write('HELLO: %05d' % i) sys.stdout.flush() time.sleep(1)
Wenn man diesen Code im Terminal ausführt, erhält man eine einfache Fortschrittsbalkenfunktion.
Es müssen noch zwei Probleme gelöst werden:
Eins: Leere缓存区
Einige kluge Leser könnten feststellen, dass es Probleme gibt, wenn die neue Zeichenkette kürzer ist als die vorherige, zum Beispiel folgendes Stück Code:
import sys, time for i in range(5) sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
Nach dem Lauf wurde das Ergebnis nicht so, wie wir es erwartet haben.
Tatsächlich liegt es daran, dass die bereits flushierten Zeichen nicht automatisch geleert werden, daher werden nur die neu geschriebenen geändert. In Bezug auf diesen Punkt ist meine aktuelle Lösung, eine Welle von Leerzeichen auszugeben, um die vorherige Zeichenkette zu verdrängen und neu zu schreiben:
import sys, time for i in range(5) sys.stdout.write(' ') * 10 + '\r') sys.stdout.flush() sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
Zwei: Festgelegte untere Ausgabe
Manchmal möchten wir, dass während des Ladens des Fortschrittsbalkens auch andere Ausgaben erfolgen.
Wir könnten nach dem Löschen der vorherigen Ausgabe die erforderliche Zeichenkette ausgeben und dann einen gefälschten Fortschrittsbalken darstellen.
Verwenden wir folgenden Code:
import sys, time for i in range(5) sys.stdout.write(' ') * 10 + '\r') sys.stdout.flush() print i sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
kann man die erforderliche Aufgabe erledigen.
Wie schaut's aus, der Prinzip ist doch recht einfach, oder?
hier wird eine selbst implementierte Klasse vorgestellt, um Fortschrittsbalken anzuzeigen:
import sys, time class ProgressBar: def __init__(self, count = 0, total = 0, width = 50): self.count = count self.total = total self.width = width def move(self): self.count += 1 def log(self, s): sys.stdout.write(' ') * (self.width + 9) + '\r') sys.stdout.flush() print s progress = self.width * self.count / self.total sys.stdout.write('{0:3}/{1:3}: '.format(self.count, self.total)) sys.stdout.write('#' * progress + '-' * (self.width - progress) + '\r') if progress == self.width: sys.stdout.write('\n') sys.stdout.flush() bar = ProgressBar(total = 10) for i in range(10) bar.move() bar.log('Wir sind angekommen bei: ' + str(i + 1)) time.sleep(1)
Das Ergebnis ist wie folgt:
So können Sie den Fortschritt der Programmausführung in einigen Aufgaben leicht überprüfen, z.B. in Spiders, maschinellem Lernen und anderen Aufgaben, die nicht bekannt sind, wie lange sie dauern werden, und auch eine visuelle Zeitvorstellung haben.
Hiermit teile ich Ihnen den gesamten Inhalt der von mir bereitgestellten Python-Code zum Erstellen eines Fortschrittsbalkens im Konsolenfenster mit. Ich hoffe, dass dies für Sie eine Referenz sein wird und ich hoffe, dass Sie die Anleitung unterstützen.
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine Haftung für rechtliche Verpflichtungen. Wenn Sie Inhalte finden, die möglicherweise urheberrechtlich geschützt sind, senden Sie bitte eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @, wenn Sie eine E-Mail senden, um eine Beschwerde einzureichen, und fügen Sie relevante Beweise bei. Bei nachgewiesener Infringement werden die fraglichen Inhalte sofort gelöscht.)