Ich möchte, dass dies auf stdout ausgedruckt wird und es immer wieder aktualisiert, nicht in eine andere Zeile gedruckt wird. Wie macht man das?
Ich habe eine neue Art von Fortschrittsbalken veröffentlicht, die Sie ausdrucken, Durchsatz und Eta sehen und sogar pausieren können, neben den sehr coolen Animationen! Bitte schau es dir an: github.com/rsalmei/alive-progress !lebendiger Fortschritt
– rsalmei
23. August 2019 um 6:44 Uhr
Mark Ruschakoff
Das '\r' Zeichen (Wagenrücklauf) setzt den Cursor an den Anfang der Zeile zurück und ermöglicht es Ihnen, den vorherigen Inhalt der Zeile zu überschreiben.
from time import sleep
import sys
for i in range(21):
sys.stdout.write('\r')
# the exact output you're looking for:
sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
sys.stdout.flush()
sleep(0.25)
Ich bin mir nicht 100% sicher, ob dies auf allen Systemen vollständig portierbar ist, aber es funktioniert zumindest unter Linux und OSX.
Dies ist besser als die markierte Antwort, da es auch mit Python 3 funktioniert.
– Gerhard Hagerer
2. Juni 2016 um 9:32 Uhr
Wie geschrieben, macht der Code nicht klar, wie dies an die Größe angepasst werden kann, über die Sie iterieren (nicht 21). Ich würde lassen n=21ersetzen range(21) mit range(n)dann füge hinzu j = (i + 1) / n innerhalb der Schleife, und ersetzen Sie die write Aussage mit dieser leichten Modifikation: sys.stdout.write("[%-20s] %d%%" % ('='*int(20*j), 100*j)). Jetzt müssen Sie nur noch ändern n=21 vor der Schleife (eher wahrscheinlich n=len(iterable)) und dann das iterierbare Objekt aufzählen. Ich habe diese Bearbeitung empfohlen, aber sie wurde abgelehnt; Anscheinend weicht die Funktionalität “von der ursprünglichen Absicht des Beitrags ab”.
– Steven C. Howell
17. Oktober 2017 um 20:55 Uhr
Adaptiv mit beliebiger Größe von n, sys.stdout.write("[{:{}}] {:.1f}%".format("="*i, n-1, (100/(n-1)*i)))nur Python 3
– Gabriel Chu
8. Januar 2018 um 22:53 Uhr
Was ist %-20s?
– Benutzer
15. Dezember 2018 um 17:51 Uhr
@StevenC.Howell, warum postest du es nicht als Antwort unter Berufung auf Mark? es ist eine andere Version und es ist sehr hilfreich, sie vorzubereiten
– GR
5. Juli 2019 um 15:54 Uhr
icktoofay
Es gibt ein Python-Modul, das Sie bekommen können PyPI genannt progressbar die eine solche Funktionalität implementiert. Wenn es Ihnen nichts ausmacht, eine Abhängigkeit hinzuzufügen, ist dies eine gute Lösung. Andernfalls gehen Sie mit einer der anderen Antworten.
Ein einfaches Beispiel für die Verwendung:
import progressbar
from time import sleep
bar = progressbar.ProgressBar(maxval=20, \
widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()])
bar.start()
for i in xrange(20):
bar.update(i+1)
sleep(0.1)
bar.finish()
Um es zu installieren, können Sie verwenden easy_install progressbaroder pip install progressbar wenn Sie Pip bevorzugen.
Alle Antworten sind großartig, aber ich mag das Modul am meisten. Danke an alle.
– Stan
9. Juni 2010 um 0:58 Uhr
Leider auch nicht progressbar Noch fish scheint mit python3 zu funktionieren.
Für mich wird die erste Zeile nicht durch den Cursor geändert – nur die zweite Zeile. Daher werden mehrere Zeilen für den Fortschrittsbalken und eine für zB erhalten ] percent * 100 %
– unseen_rider
15. Oktober 2017 um 16:04 Uhr
Die zweite Funktion funktioniert gut, aber ich musste hinzufügen: if percent == 1: print(”)
– glücklich
21. August 2021 um 20:13 Uhr
HyperionX
Probieren Sie diese Funktion nur mit der integrierten aus sys:
import sys
def print_progress_bar(index, total, label):
n_bar = 50 # Progress bar width
progress = index / total
sys.stdout.write('\r')
sys.stdout.write(f"[{'=' * int(n_bar * progress):{n_bar}s}] {int(100 * progress)}% {label}")
sys.stdout.flush()
Verwendungszweck:
foo_list = ["a", "b", "c", "d"]
total = len(foo_list)
for index, item in enumerate(foo_list):
print_progress_bar(index, total, "foo bar")
sleep(0.5)
enumerate(foo_list) gibt Ihnen während einer Schleife Zugriff auf den Indexwert.
Ausgabe:
[================================================ ] 96% foo bar
Für mich wird die erste Zeile nicht durch den Cursor geändert – nur die zweite Zeile. Daher werden mehrere Zeilen für den Fortschrittsbalken und eine für zB erhalten ] percent * 100 %
– unseen_rider
15. Oktober 2017 um 16:04 Uhr
Die zweite Funktion funktioniert gut, aber ich musste hinzufügen: if percent == 1: print(”)
– glücklich
21. August 2021 um 20:13 Uhr
Keine der geposteten Antworten ging vollständig auf meine Bedürfnisse ein. Also habe ich meine eigenen geschrieben, wie oben gezeigt. Die Funktionen, die ich brauchte:
Übergeben Sie nur die Schrittnummer und die Gesamtzahl der Schritte und es erledigt die schwierige Aufgabe der Berechnung des Prozentsatzes abgeschlossen.
Unterteilen Sie 60 Zeichen in 480 „Ticks“, um 0,21 % pro Tick zu erhalten. Ohne Häkchen wäre jedes Zeichen nur 1,67 %.
Unterstützung für das Voranstellen eines Titels.
Optionaler Prozentsatz abgeschlossen am Ende der Zeile.
Fortschrittsbalken mit variabler Länge, der standardmäßig 60 Zeichen oder 480 “Ticks” hat.
Legen Sie die Farbe des Fortschrittsbalkens fest, die Standardeinstellung ist grün.
So rufen Sie die Fortschrittsanzeige auf
Das Aufrufen der Fortschrittsanzeige ist ziemlich einfach. Für das obige Beispiel .gif Die Funktion wurde aufgerufen mit:
Das total_steps war etwa 2.500 für len(rows) im Stack Exchange Data Dump im CSV-Format. Das step war die aktuelle Zeilennummer, da jedes Stack Exchange Markdown Q&A in Kramdown (für GitHub-Seiten) umgewandelt wurde.
Python-Code
Der Code ist einfach, aber etwas länger als die anderen Antworten:
def percent_complete(step, total_steps, bar_width=60, title="", print_perc=True):
import sys
# UTF-8 left blocks: 1, 1/8, 1/4, 3/8, 1/2, 5/8, 3/4, 7/8
utf_8s = ["█", "▏", "▎", "▍", "▌", "▋", "▊", "█"]
perc = 100 * float(step) / float(total_steps)
max_ticks = bar_width * 8
num_ticks = int(round(perc / 100 * max_ticks))
full_ticks = num_ticks / 8 # Number of full blocks
part_ticks = num_ticks % 8 # Size of partial block (array index)
disp = bar = "" # Blank out variables
bar += utf_8s[0] * int(full_ticks) # Add full blocks into Progress Bar
# If part_ticks is zero, then no partial block, else append part char
if part_ticks > 0:
bar += utf_8s[part_ticks]
# Pad Progress Bar with fill character
bar += "▒" * int((max_ticks/8 - float(num_ticks)/8.0))
if len(title) > 0:
disp = title + ": " # Optional title to progress display
# Print progress bar in green: https://stackoverflow.com/a/21786287/6929343
disp += "\x1b[0;32m" # Color Green
disp += bar # Progress bar to progress display
disp += "\x1b[0m" # Color Reset
if print_perc:
# If requested, append percentage complete to progress display
if perc > 100.0:
perc = 100.0 # Fix "100.04 %" rounding error
disp += " {:6.2f}".format(perc) + " %"
# Output to terminal repetitively over the same line using '\r'.
sys.stdout.write("\r" + disp)
sys.stdout.flush()
Anmerkungen zum Python-Code
Ein paar Punkte:
Das [ .... ] Klammerplatzhalter in der Frage sind nicht erforderlich, da es die Füllzeichen gibt, die demselben Zweck dienen. Dies spart zwei zusätzliche Zeichen, um den Fortschrittsbalken breiter zu machen.
Das bar_width Schlüsselwortparameter können abhängig von der Bildschirmbreite verwendet werden. Die Vorgabe von 60 scheint für die meisten Zwecke gut geeignet zu sein.
Das print_perc=True Der Standardwert des Schlüsselwortparameters kann durch Übergeben überschrieben werden print_perc=False beim Aufruf der Funktion. Dies würde einen längeren Fortschrittsbalken ermöglichen.
Das title="" Der Schlüsselwortparameter ist standardmäßig auf keinen Titel eingestellt. Sollten Sie eine Verwendung wünschen title="My Title" und : wird automatisch hinzugefügt.
Wenn Ihr Programm beendet ist, denken Sie daran, anzurufen sys.stdout.write("\r") gefolgt von sys.stdout.flush() um die Fortschrittsanzeige zu löschen.
Zusammenfassung
Diese Antwort ist etwas länger als die anderen, aber es ist wichtig zu beachten, dass es sich um eine vollständige Lösung handelt, nicht um einen Teil einer Lösung, der Sie mehr Code hinzufügen müssen.
Ein weiterer Punkt ist, dass diese Lösung keine Abhängigkeiten hat und nichts extra installiert werden muss. Der Zeichensatz UTF-8 wird von Python und unterstützt gnome-terminal war keine zusätzliche Einrichtung erforderlich. Wenn Sie Python 2.7 verwenden, benötigen Sie möglicherweise # -*- coding: utf-8 -*- nach dem Krach. IE als zweite Zeile Ihres Programms.
Die Funktion könnte mit separate in eine Klasse umgewandelt werden init, update, pause (um Debug-Sachen auf den Bildschirm zu drucken), resume und close Methoden.
Diese Funktion wurde aus einem Bash-Skript konvertiert:
Wie füge ich einem Shell-Skript einen Fortschrittsbalken hinzu?
Das Bash-Skript würde die Sony TV-Lautstärke mit anzeigen libnotify-bin (Popup-Blasenmeldung), wenn die TV-Lautstärke geändert wurde. Wenn Sie an einem Bash-Fortschrittsbalken interessiert sind, besuchen Sie bitte den Stack Overflow-Link.
Bearbeiten 30. Januar 2022
Ändern Sie von 4 Ticks auf 8 Ticks pro Zeichen.
Entfernen Sie Pausen zwischen ganzen Blöcken.
Farbunterstützung hinzufügen.
Sie müssen full_ticks in ein int umwandeln. bar += utf_8s[0] * int(full_ticks) # Add full blocks into Progress Bar
– kblst
27. Juni um 15:13 Uhr
@kblst Danke für den Hinweis int(full_ticks) Erweiterung. Welche Python-Version verwendest du? Benutzt du bar_width=60 Standard oder mit einem anderen Wert überschreiben?
– WinEunuuchs2Unix
27. Juni um 22:28 Uhr
Ich verwende Python3.9 – ich glaube, dass die automatische Umwandlung in int in diesem Fall vor einigen Versionen entfernt wurde. Verwenden Sie ansonsten Ihre Standardeinstellungen.
– kblst
28. Juni um 16:41 Uhr
@kblst Vielen Dank für Ihren Beitrag. Ich habe die Antwort mit aktualisiert int(full_ticks)
– WinEunuuchs2Unix
29. Juni um 11:39 Uhr
10297700cookie-checkWie drucke ich die Statusleiste und den Prozentsatz aus?yes
Ich habe eine neue Art von Fortschrittsbalken veröffentlicht, die Sie ausdrucken, Durchsatz und Eta sehen und sogar pausieren können, neben den sehr coolen Animationen! Bitte schau es dir an: github.com/rsalmei/alive-progress !lebendiger Fortschritt
– rsalmei
23. August 2019 um 6:44 Uhr