Ich habe eine einfache Konsolen-App zum Hoch- und Herunterladen von Dateien von einem FTP-Server mithilfe der ftplib geschrieben.
Ich möchte, dass die App dem Benutzer eine Visualisierung des Download- / Upload-Fortschritts anzeigt. Jedes Mal, wenn ein Datenblock heruntergeladen wird, möchte ich, dass er eine Fortschrittsaktualisierung bereitstellt, auch wenn es sich nur um eine numerische Darstellung wie einen Prozentsatz handelt.
Wichtig ist, dass ich vermeiden möchte, den gesamten Text zu löschen, der in den vorherigen Zeilen auf der Konsole gedruckt wurde (dh ich möchte nicht das gesamte Terminal "löschen", während der aktualisierte Fortschritt gedruckt wird).
Dies scheint eine ziemlich häufige Aufgabe zu sein. Wie kann ich einen Fortschrittsbalken oder eine ähnliche Visualisierung erstellen, die auf meiner Konsole ausgegeben wird, während die vorherige Programmausgabe beibehalten wird?
Antworten:
Eine einfache, anpassbare Fortschrittsanzeige
Hier ist eine Zusammenfassung vieler der folgenden Antworten, die ich regelmäßig verwende (keine Importe erforderlich).
Hinweis: Dies ist für Python 3; Weitere Informationen zur Verwendung in Python 2 finden Sie in den Kommentaren.
Beispielnutzung
Beispielausgabe:
Aktualisieren
In den Kommentaren wurde eine Option diskutiert, mit der der Fortschrittsbalken dynamisch an die Breite des Terminalfensters angepasst werden kann. Obwohl ich dies nicht empfehle, ist hier ein Kern , der diese Funktion implementiert (und die Vorbehalte beachtet ).
quelle
# Size of terminal rows, columns = [int(x) for x in os.popen('stty size', 'r').read().split()]
columns
an die Länge übergeben werden sollte, um die Größe des Fortschrittsbalkens an das Terminalfenster anzupassen. Obwohl die Länge des fortschreitenden Teils des Balkens verringert werden sollte (nach Länge des Präfixes, des Suffix, des'\r%s |%s| %s%% %s'
end = '\r'
zuend = ''
.Wenn Sie '\ r' schreiben, bewegt sich der Cursor zurück zum Zeilenanfang.
Dies zeigt einen Prozentzähler an:
quelle
99%
print
hat einend
Argument: stackoverflow.com/a/8436827/1959808print
hat auch einflush
Argument: docs.python.org/3/library/functions.html#printtqdm: Fügen Sie Ihren Loops in einer Sekunde eine Fortschrittsanzeige hinzu :
quelle
Schreiben Sie eine
\r
an die Konsole. Dies ist ein "Wagenrücklauf", bei dem der gesamte nachfolgende Text am Zeilenanfang wiedergegeben wird. Etwas wie:das gibt dir so etwas wie:
[ ########## ] 100%
quelle
\r
und schreibe dann die ganze Zeile noch einmal aus. Grundsätzlich:print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(amtDone * 50), amtDone * 100))
WoamtDone
ist ein Float zwischen 0 und 1.sys.stdout.write
alsprint
. Mit habeprint
ich Zeilenumbrüche.,
am Ende derprint
Arbeiten ein Komma hinzu .print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(workdone * 50), workdone*100), end="", flush=True)
, woworkdone
ist ein Float zwischen 0 und 1, zBworkdone = parsed_dirs/total_dirs
Es sind weniger als 10 Codezeilen.
Das Wesentliche hier: https://gist.github.com/vladignatyev/06860ec2040cb497f0f3
quelle
Probieren Sie die Klickbibliothek von Mozart of Python, Armin Ronacher.
So erstellen Sie einen einfachen Fortschrittsbalken:
So sieht es aus:
Passen Sie nach Herzenslust an:
Benutzerdefinierter Look:
Es gibt noch mehr Optionen, siehe API-Dokumente :
quelle
Mir ist klar, dass ich zu spät zum Spiel komme, aber hier ist ein leicht Yum-artiger (Red Hat), den ich geschrieben habe (hier wird keine 100% ige Genauigkeit angestrebt, aber wenn Sie einen Fortschrittsbalken für diese Genauigkeitsstufe verwenden, dann Sie sind sowieso FALSCH):
Sollte so etwas hervorbringen:
... wo die Klammern stehen bleiben und nur die Hashes zunehmen.
Dies könnte als Dekorateur besser funktionieren. Für einen anderen Tag...
quelle
Überprüfen Sie diese Bibliothek: clint
Es hat viele Funktionen, einschließlich eines Fortschrittsbalkens:
Dieser Link bietet einen schnellen Überblick über die Funktionen
quelle
Hier ist ein schönes Beispiel für einen in Python geschriebenen Fortschrittsbalken: http://nadiana.com/animated-terminal-progress-bar-in-pythonAber wenn du es selbst schreiben willst. Sie könnten das
curses
Modul verwenden, um die Dinge einfacher zu machen :)[Bearbeiten] Vielleicht einfacher ist nicht das Wort für Flüche. Aber wenn Sie ein ausgewachsenes Cui kreieren möchten, dann kümmern sich Flüche um eine Menge Dinge für Sie.
[Bearbeiten] Da der alte Link tot ist, habe ich meine eigene Version einer Python-Fortschrittsleiste erstellt. Diese finden Sie hier: https://github.com/WoLpH/python-progressbar
quelle
curses
? Einfacher? Hmmm ....Ausgabe
[29%] ===================
quelle
Und um den Stapel zu erweitern, hier ist ein Objekt, das Sie verwenden können
Ergebnisse in:
Dies wird am häufigsten als "übertrieben" angesehen, ist jedoch praktisch, wenn Sie es häufig verwenden
quelle
Installieren Sie
tqdm
. (pip install tqdm
) Und verwenden Sie es wie folgt:Das ist ein 10-Sekunden-Fortschrittsbalken, der ungefähr Folgendes ausgibt:
quelle
Führen Sie dies in der Python-Befehlszeile aus ( nicht in einer IDE oder Entwicklungsumgebung):
Funktioniert gut auf meinem Windows-System.
quelle
Und viele Tutorials warten darauf, gegoogelt zu werden.
quelle
Ich benutze den Fortschritt von reddit . Ich mag es, weil es den Fortschritt für jedes Element in einer Zeile drucken kann und Ausdrucke nicht aus dem Programm löschen sollte.
Bearbeiten: fester Link
quelle
Aufgrund der obigen Antworten und anderer ähnlicher Fragen zum CLI-Fortschrittsbalken habe ich eine allgemeine Antwort auf alle Fragen erhalten. Überprüfen Sie es bei https://stackoverflow.com/a/15860757/2254146
Zusammenfassend lautet der Code wie folgt:
Sieht aus wie
Prozent: [##########] 99,0%
quelle
Ich empfehle die Verwendung von tqdm - https://pypi.python.org/pypi/tqdm - was es einfach macht, iterierbare Elemente oder Prozesse in einen Fortschrittsbalken umzuwandeln und alle Probleme mit den benötigten Terminals zu lösen.
Aus der Dokumentation: "tqdm kann problemlos Rückrufe / Hooks und manuelle Updates unterstützen. Hier ein Beispiel mit urllib"
quelle
Versuchen Sie, dieses Paket zu installieren:
pip install progressbar2
:progresssbar github: https://github.com/WoLpH/python-progressbar
quelle
Eine sehr einfache Lösung besteht darin, diesen Code in Ihre Schleife einzufügen:
Fügen Sie dies in den Text (dh oben) Ihrer Datei ein:
Fügen Sie dies in den Körper Ihrer Schleife ein:
quelle
HINWEIS: Wenn Sie dies in einem interaktiven Interepter ausführen, werden zusätzliche Nummern ausgedruckt
quelle
lol ich habe gerade eine ganze Sache geschrieben, hier ist der Code. Denken Sie daran, dass Sie keinen Unicode verwenden können, wenn Sie Block ASCII ausführen. Ich verwende CP437
und du nennst es so
so sieht es also aus
quelle
Mit den oben genannten tollen Ratschlägen arbeite ich den Fortschrittsbalken aus.
Ich möchte jedoch auf einige Mängel hinweisen
Jedes Mal, wenn der Fortschrittsbalken geleert wird, beginnt er in einer neuen Zeile
wie folgt :
[] 0%
[#] 10
%
[##] 20% [###] 30%
2.Die eckige Klammer ']' und die Prozentzahl auf der rechten Seite verschieben sich nach rechts, wenn die '###' länger wird.
3. Ein Fehler tritt auf, wenn der Ausdruck 'progress / 10' keine Ganzzahl zurückgeben kann.
Der folgende Code behebt das oben genannte Problem.
quelle
Code für den Fortschrittsbalken des Python-Terminals
quelle
Ich habe einen einfachen Fortschrittsbalken geschrieben:
Wie Sie sehen können, hat es: Länge der Leiste, Präfix und Suffix, Füllzeichen, Leerzeichen, Text in der Leiste zu 100% (oncomp) und Ränder
hier ein Beispiel:
out in progress:
out on complete:
quelle
Stellen Sie einige der Ideen zusammen, die ich hier gefunden habe, und fügen Sie die geschätzte verbleibende Zeit hinzu:
quelle
Für Python 3:
quelle
Nun, hier ist Code, der funktioniert und ich habe ihn vor dem Posten getestet:
Vorteile:
Nachteile:
prog2 = prog/5
zuprog2 = int(prog/5)
)quelle
Hier ist meine Python 3-Lösung:
'\ b' ist ein Backslash für jedes Zeichen in Ihrer Zeichenfolge. Dies funktioniert nicht im Windows-Cmd-Fenster.
quelle
Funktion von Greenstick für 2.7:
quelle
Die Fortschrittsanzeige des Python-Moduls ist eine gute Wahl. Hier ist mein typischer Code:
quelle