J'ai écrit une application console simple pour télécharger et télécharger des fichiers à partir d'un serveur FTP en utilisant le ftplib.
Je voudrais que l'application montre une visualisation de sa progression de téléchargement / téléchargement pour l'utilisateur; chaque fois qu'un morceau de données est téléchargé, je voudrais qu'il fournisse une mise à jour de progression, même si c'est juste une représentation numérique comme un pourcentage.
Surtout, je veux éviter d'effacer tout le texte qui a été imprimé sur la console dans les lignes précédentes (c'est-à-dire que je ne veux pas "effacer" tout le terminal lors de l'impression de la progression mise à jour).
Cela semble une tâche assez courante - comment puis-je faire une barre de progression ou une visualisation similaire qui sort sur ma console tout en préservant la sortie du programme précédent?
Réponses:
Une barre de progression simple et personnalisable
Voici un ensemble de nombreuses réponses ci-dessous que j'utilise régulièrement (aucune importation requise).
Remarque: c'est pour Python 3; voir les commentaires pour plus de détails sur l'utilisation de ceci dans Python 2.
Exemple d'utilisation
Exemple de sortie:
Mise à jour
Il y a eu une discussion dans les commentaires concernant une option qui permet à la barre de progression de s'adapter dynamiquement à la largeur de la fenêtre du terminal. Bien que je ne le recommande pas, voici un résumé qui implémente cette fonctionnalité (et note les mises en garde).
la source
# Size of terminal rows, columns = [int(x) for x in os.popen('stty size', 'r').read().split()]
columns
devrait être passée à la longueur pour ajuster la taille de la barre de progression à la fenêtre du terminal. Bien que la longueur de la partie de la barre qui progresse devrait être réduite (par la longueur du préfixe, du suffixe, du pourcentage et des caractères supplémentaires dans cette chaîne'\r%s |%s| %s%% %s'
end = '\r'
àend = ''
.L'écriture de '\ r' ramènera le curseur au début de la ligne.
Cela affiche un compteur de pourcentage:
la source
99%
print
a unend
argument: stackoverflow.com/a/8436827/1959808print
également unflush
argument: docs.python.org/3/library/functions.html#printtqdm: ajoutez un indicateur de progression à vos boucles en une seconde :
la source
Écrivez un
\r
sur la console. Il s'agit d'un "retour chariot" qui fait écho à tout le texte qui le suit au début de la ligne. Quelque chose comme:ce qui vous donnera quelque chose comme:
[ ########## ] 100%
la source
\r
, puis réécrivez la ligne entière. Fondamentalement:,print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(amtDone * 50), amtDone * 100))
oùamtDone
est un flotteur entre 0 et 1.sys.stdout.write
queprint
. Avec,print
j'ai des nouvelles lignes.,
à la fin desprint
travaux pour moi.print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(workdone * 50), workdone*100), end="", flush=True)
oùworkdone
est un flottant entre 0 et 1, par exemple,workdone = parsed_dirs/total_dirs
C'est moins de 10 lignes de code.
L'essentiel ici: https://gist.github.com/vladignatyev/06860ec2040cb497f0f3
la source
Essayez la bibliothèque de clics écrite par le Mozart de Python, Armin Ronacher.
Pour créer une barre de progression simple:
Voici à quoi ça ressemble:
Personnalisez le contenu de votre cœur:
Look personnalisé:
Il y a encore plus d'options, consultez la documentation de l' API :
la source
Je me rends compte que je suis en retard dans le jeu, mais voici un style légèrement Yum (Red Hat) que j'ai écrit (ne recherchant pas une précision de 100% ici, mais si vous utilisez une barre de progression pour ce niveau de précision, alors vous vous avez tort de toute façon):
Devrait produire quelque chose ressemblant à ceci:
... où les supports restent immobiles et seuls les hachages augmentent.
Cela pourrait mieux fonctionner en tant que décorateur. Pour un autre jour ...
la source
Consultez cette bibliothèque: clint
il possède de nombreuses fonctionnalités dont une barre de progression:
ce lien donne un aperçu rapide de ses fonctionnalités
la source
Voici un bel exemple d'une barre de progression écrite en Python: http://nadiana.com/animated-terminal-progress-bar-in-pythonMais si vous voulez l'écrire vous-même. Vous pouvez utiliser le
curses
module pour faciliter les choses :)[modifier] Peut-être plus facile n'est pas le mot pour les malédictions. Mais si vous voulez créer un cui à part entière, curses s'occupe de beaucoup de choses pour vous.
[edit] Puisque l'ancien lien est mort, j'ai mis en place ma propre version d'une barre de progression Python, téléchargez-la ici: https://github.com/WoLpH/python-progressbar
la source
curses
? Plus facile? Hmmm ....production
[29%] ===================
la source
et, juste pour ajouter à la pile, voici un objet que vous pouvez utiliser
résulte en:
Ce serait le plus souvent considéré comme «par-dessus», mais c'est pratique lorsque vous l'utilisez beaucoup
la source
Installez
tqdm
. (pip install tqdm
) Et utilisez-le comme suit:C'est une barre de progression de 10 secondes qui produira quelque chose comme ceci:
la source
Exécutez ceci sur la ligne de commande Python ( pas dans un environnement de développement ou IDE):
Fonctionne très bien sur mon système Windows.
la source
Et beaucoup de tutoriels attendent d'être googlé.
la source
J'utilise les progrès de reddit . Je l'aime parce qu'il peut imprimer la progression de chaque élément sur une seule ligne, et il ne devrait pas effacer les impressions du programme.
Modifier: lien fixe
la source
Essayez d'installer ce package
pip install progressbar2
::progresssbar github: https://github.com/WoLpH/python-progressbar
la source
sur la base des réponses ci-dessus et d'autres questions similaires sur la barre de progression CLI, je pense avoir obtenu une réponse commune générale à toutes. Vérifiez-le sur https://stackoverflow.com/a/15860757/2254146
En résumé, le code est le suivant:
Ressemble à
Pourcentage: [##########] 99,0%
la source
Je recommande d'utiliser tqdm - https://pypi.python.org/pypi/tqdm - qui simplifie la transformation de tout itérable ou processus en barre de progression et gère tous les problèmes avec les terminaux nécessaires.
D'après la documentation: "tqdm peut facilement prendre en charge les rappels / hooks et les mises à jour manuelles. Voici un exemple avec urllib"
la source
Une solution très simple consiste à mettre ce code dans votre boucle:
Mettez ceci dans le corps (c'est-à-dire en haut) de votre fichier:
Mettez cela dans le corps de votre boucle:
la source
REMARQUE: si vous exécutez cela dans un interepter interactif, vous obtenez des numéros supplémentaires imprimés
la source
lol je viens d'écrire tout un truc pour ceci voici le code gardez à l'esprit que vous ne pouvez pas utiliser unicode lorsque vous faites le bloc ascii j'utilise cp437
et vous l'appelez comme ça
donc ça ressemble à ça
la source
Avec les bons conseils ci-dessus, je travaille sur la barre de progression.
Cependant, je voudrais souligner quelques lacunes
Chaque fois que la barre de progression est effacée, elle démarre sur une nouvelle ligne
comme ceci:
[] 0%
[#] 10%
[##] 20%
[###] 30%
2.Le crochet carré "]" et le pourcentage sur le côté droit se déplacent vers la droite à mesure que le "###" s'allonge.
3. Une erreur se produira si l'expression «progress / 10» ne peut pas renvoyer un entier.
Et le code suivant résoudra le problème ci-dessus.
la source
Code pour la barre de progression du terminal python
la source
j'ai écrit une barre de progression simple:
comme vous pouvez le voir, il a: longueur de la barre, préfixe et suffixe, remplissage, espace, texte en barre à 100% (oncomp) et bordures
voici un exemple:
en cours:
sur complet:
la source
Rassembler certaines des idées que j'ai trouvées ici, et ajouter le temps restant estimé:
la source
Pour python 3:
la source
Eh bien voici du code qui fonctionne et je l'ai testé avant de poster:
Avantages:
Les inconvénients:
prog2 = prog/5
àprog2 = int(prog/5)
)la source
Voici ma solution Python 3:
'\ b' est une barre oblique inverse, pour chaque caractère de votre chaîne. Cela ne fonctionne pas dans la fenêtre cmd de Windows.
la source
fonction de Greenstick pour 2.7:
la source
La barre de progression du module python est un bon choix. Voici mon code typique:
la source