574 Stimmen

Textfortschrittsbalken im Terminal mit Blockzeichen

Ich habe eine einfache Konsolenanwendung zum Hoch- und Herunterladen von Dateien von einem FTP-Server unter Verwendung der ftplib geschrieben.

Ich möchte, dass die App eine Visualisierung des Download/Upload-Fortschritts für den Benutzer anzeigt; jedes Mal, wenn ein Datenpaket heruntergeladen wird, möchte ich, dass sie eine Fortschrittsaktualisierung bereitstellt, auch wenn es nur eine numerische Darstellung wie ein Prozentsatz ist.

Wichtig ist, dass ich vermeiden möchte, den gesamten Text zu löschen, der in den vorherigen Zeilen auf der Konsole ausgegeben wurde (d. h. ich möchte nicht das gesamte Terminal "löschen", während ich den aktualisierten Fortschritt ausdrucke).

Dies scheint eine ziemlich häufige Aufgabe - wie kann ich über die Erstellung eines Fortschrittsbalken oder ähnliche Visualisierung, die Ausgaben zu meiner Konsole unter Beibehaltung der vorherigen Programmausgabe gehen?

0 Stimmen

Sieht aus wie ein Duplikat dieser gestern gestellten Frage: stackoverflow.com/questions/3160699/python-progress-bar/3162864 Sie sollten also Fisch verwenden pypi.python.org/pypi/fish

37 Stimmen

"Verwenden Sie einfach eine grafische Benutzeroberfläche" verkennt, dass grafische Benutzeroberflächen in einigen Situationen (schnelle Lernkurve, Ad-hoc-Sondierungs- oder interaktive oder einmalige Aktivitäten) großartig sind, während Befehlszeilentools für andere Situationen großartig sind (erfahrene Benutzer, die Ad-hoc-Anwendungen im Handumdrehen zusammenstellen, um eine sorgfältig definierte Operation viele Male durchzuführen).

31 Stimmen

Ich habe für die Wiedereröffnung gestimmt. Die Frage scheint mir nicht zu weit gefasst zu sein.

75voto

The Unfun Cat Punkte 26313

Versuchen Sie die anklicken. Bibliothek, geschrieben vom Mozart der Python, Armin Ronacher.

$ pip install click # both 2 and 3 compatible

So erstellen Sie einen einfachen Fortschrittsbalken:

import click

with click.progressbar(range(1000000)) as bar:
    for i in bar:
        pass 

So sieht es aus:

# [###-------------------------------]    9%  00:01:14

Gestalten Sie nach Herzenslust:

import click, sys

with click.progressbar(range(100000), file=sys.stderr, show_pos=True, width=70, bar_template='(_(_)=%(bar)sD(_(_| %(info)s', fill_char='=', empty_char=' ') as bar:
    for i in bar:
        pass

Individuelles Aussehen:

(_(_)===================================D(_(_| 100000/100000 00:00:02

Es gibt noch mehr Optionen, siehe die API-Dokumente :

 click.progressbar(iterable=None, length=None, label=None, show_eta=True, show_percent=None, show_pos=False, item_show_func=None, fill_char='#', empty_char='-', bar_template='%(label)s [%(bar)s] %(info)s', info_sep=' ', width=36, file=None, color=None)

36voto

JoeLinux Punkte 3990

Mir ist klar, dass ich zu spät dran bin, aber hier ist ein etwas Yum-artiges (Red Hat), das ich geschrieben habe (ich strebe hier keine 100%ige Genauigkeit an, aber wenn Sie einen Fortschrittsbalken für diesen Grad an Genauigkeit verwenden, dann sind Sie sowieso FALSCH):

import sys

def cli_progress_test(end_val, bar_length=20):
    for i in xrange(0, end_val):
        percent = float(i) / end_val
        hashes = '#' * int(round(percent * bar_length))
        spaces = ' ' * (bar_length - len(hashes))
        sys.stdout.write("\rPercent: [{0}] {1}%".format(hashes + spaces, int(round(percent * 100))))
        sys.stdout.flush()

Das Ergebnis sollte in etwa so aussehen:

Percent: [##############      ] 69%

... wobei die Klammern unverändert bleiben und nur die Hashes zunehmen.

Das funktioniert vielleicht besser als Dekorateur. Für einen anderen Tag...

18voto

scripts Punkte 1372

Prüfen Sie diese Bibliothek: clint

Es hat viele Funktionen, darunter einen Fortschrittsbalken:

from time import sleep  
from random import random  
from clint.textui import progress  
if __name__ == '__main__':
    for i in progress.bar(range(100)):
        sleep(random() * 0.2)

    for i in progress.dots(range(100)):
        sleep(random() * 0.2)

este Link bietet einen schnellen Überblick über seine Funktionen

12voto

Wolph Punkte 73880

Hier ist ein schönes Beispiel für einen in Python geschriebenen Fortschrittsbalken: http://nadiana.com/animated-terminal-progress-bar-in-python

Aber wenn Sie es selbst schreiben wollen. Sie könnten die curses Modul, um die Dinge zu erleichtern :)

[Bearbeiten] Vielleicht ist einfacher nicht das richtige Wort für Flüche. Aber wenn Sie ein vollwertiges cui erstellen wollen, dann übernimmt curses eine Menge Dinge für Sie.

[Bearbeiten] Da der alte Link tot ist, habe ich meine eigene Version einer Python Progressbar erstellt, die hier zu finden ist: https://github.com/WoLpH/python-progressbar

14 Stimmen

curses ? Einfacher? Hmmm....

0 Stimmen

Ein hervorragender Artikel, ich wollte einen Link dazu angeben, konnte ihn aber in meinen Lesezeichen nicht finden :)

0 Stimmen

@Aviral Dasgupta: Schon gut, einfacher ist hier vielleicht nicht das richtige Wort. Es kann einem aber eine Menge Arbeit ersparen, aber es hängt wirklich davon ab, wonach man sucht.

12voto

HibernatedGuy Punkte 1609
import time,sys

for i in range(100+1):
    time.sleep(0.1)
    sys.stdout.write(('='*i)+(''*(100-i))+("\r [ %d"%i+"% ] "))
    sys.stdout.flush()

Ausgabe

[ 29% ] ===================

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X