Wie drucke ich die Statusleiste und den Prozentsatz aus?

Lesezeit: 9 Minuten

Benutzer-Avatar
Stan

So implementieren Sie eine Statusleiste wie unten:

[==========                ]  45%
[================          ]  60%
[==========================] 100%

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

Benutzer-Avatar
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

Benutzer-Avatar
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.

    – Jim Garnison

    16. September 2014 um 6:47 Uhr

  • Mach nichts, ich Fest fish um mit python3 zu arbeiten.

    – Jim Garnison

    16. September 2014 um 7:18 Uhr

  • Dieses Modul wurde seit über 2 Jahren nicht aktualisiert. Verwenden Sie es nicht für neue Software!

    – Navin

    5. Juli 2017 um 23:02 Uhr


  • Installation: sudo -H pip install progressbar2.

    – Martin Thoma

    9. August 2017 um 7:20 Uhr

Benutzer-Avatar
Omikron

Ich fand nützliche Bibliothek tqdm (https://github.com/tqdm/tqdm/bisher: https://github.com/noamraph/tqdm). Es schätzt automatisch die Fertigstellungszeit und kann als Iterator verwendet werden.

Verwendungszweck:

import tqdm
import time

for i in tqdm.tqdm(range(1000)):
    time.sleep(0.01)
    # or other long operations

Ergebnisse in:

|####------| 450/1000  45% [elapsed: 00:04 left: 00:05, 99.15 iters/sec]

tqdm kann jedes Iterable umschließen.

  • Das Das tqdm-Projekt wird jetzt hier gepflegt von einem neuen Entwicklerteam.

    – gierig

    1. Dezember 2015 um 21:58 Uhr

  • Wow, dieses tqdm ist einfach unglaublich und so einfach zu bedienen 🙂 .

    – Sidahmed

    28. Februar 2016 um 21:44 Uhr

  • dies ist mit Sicherheit die einfachste Lösung

    – kd88

    26. Dezember 2016 um 16:21 Uhr

  • Es ist auch im Paket mit der Anaconda-Distribution enthalten! (mindestens für Python 3.5 und höher)

    – Jakquot

    4. Februar 2018 um 13:20 Uhr

  • Danke, erstaunlich, einfach und effektiv

    – DavideL

    11. Mai 2020 um 21:53 Uhr

Benutzer-Avatar
Matthäus Flaschen

Sie können verwenden \r (Wagenrücklauf). Demo:

import sys
total = 10000000
point = total / 100
increment = total / 20
for i in xrange(total):
    if(i % (5 * point) == 0):
        sys.stdout.write("\r[" + "=" * (i / increment) +  " " * ((total - i)/ increment) + "]" +  str(i / point) + "%")
        sys.stdout.flush()

Benutzer-Avatar
Jakob CUI

Hier können Sie folgenden Code als Funktion verwenden:

def drawProgressBar(percent, barLen = 20):
    sys.stdout.write("\r")
    progress = ""
    for i in range(barLen):
        if i < int(barLen * percent):
            progress += "="
        else:
            progress += " "
    sys.stdout.write("[ %s ] %.2f%%" % (progress, percent * 100))
    sys.stdout.flush()

Bei Verwendung von .format:

def drawProgressBar(percent, barLen = 20):
    # percent float from 0 to 1. 
    sys.stdout.write("\r")
    sys.stdout.write("[{:<{}}] {:.0f}%".format("=" * int(barLen * percent), barLen, percent * 100))
    sys.stdout.flush()

  • 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


Benutzer-Avatar
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


Geben Sie hier die Bildbeschreibung ein

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:

percent_complete(step, total_steps, title="Convert Markdown")

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

1029770cookie-checkWie drucke ich die Statusleiste und den Prozentsatz aus?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy