English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Code pour la fonction de barre de progression de la console en Python

Le principal problème de la barre de progression est que tous les caractères sont sur la même ligne et peuvent être modifiés.

Cependant, lorsque l'expression print est exécutée, Python ajoute automatiquement '\n' à la fin de l'expression, c'est-à-dire un retour à la ligne, ce qui rend impossible toute modification dans le terminal après un print. Donc, notre output ne peut plus être réalisé avec print.

Nous allons utiliser la fonction sys.stdout.write() de la bibliothèque sys, cette fonction affiche cette chaîne de caractères sur le console sans ajouter de fin, ce qui signifie que cette sortie n'est pas encore terminée. En utilisant la fonction sys.stdout.flush(), on peut temporairement imprimer l'output dans la console (créant ainsi l'illusion d'un print, nous l'appellerons d'abord output fictif). Alors, si nous utilisons le caractère d'échappement 'r' (retour à la ligne), tout semble plus logique, n'est-ce pas ?

C'est-à-dire : lors de l'affichage d'une chaîne de caractères, sans ajouter '\n', puis retourner à la ligne d'origine, puis afficher le tampon actuel, ce qui est presque comme un print, mais à ce moment-là, le curseur est toujours à sa position d'origine.

Un exemple

[Après test, cela fonctionne uniquement dans un terminal Linux, la sortie de débogage dans pycharm n'a pas d'effet]

import sys, time
for i in range(5) :
 sys.stdout.write('HELLO: %05d' % i)
 sys.stdout.flush()
 time.sleep(1)

En exécutant ce code dans un terminal, on obtient un effet simple de barre de progression.

Il reste encore deux problèmes à résoudre :

Première partie : vidage du tampon

Certains lecteurs intelligents peuvent remarquer que lorsque la nouvelle chaîne est plus courte que la précédente, il peut y avoir des problèmes, par exemple dans le code suivant :

import sys, time
for i in range(5) :
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)

Après exécution, le résultat est légèrement différent de ce que nous souhaitions.

En réalité, c'est parce que les caractères déjà flush ne sont pas supprimés automatiquement, donc seules les nouvelles entrées sont modifiées. À ce sujet, ma solution actuelle consiste à écrire une série d'espaces pour effacer la chaîne précédente et à écrire à nouveau :

import sys, time
for i in range(5) :
sys.stdout.write(' ') * 10 + '\r')
sys.stdout.flush()
sys.stdout.write(str(i) * (5 - i) + '\r')
sys.stdout.flush()
time.sleep(1)

Deuxième partie : sortie de bord inférieur fixe

Parfois, nous souhaitons que d'autres sorties soient affichées en même temps que la barre de progression.

Nous allons d'abord effacer la sortie précédente, puis écrire la chaîne de caractères nécessaire, puis afficher la barre de progression fictive.

En utilisant le code suivant :

import sys, time
for i in range(5) :
 sys.stdout.write(' ') * 10 + '\r')
 sys.stdout.flush()
 print i
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)

on peut accomplir la tâche nécessaire.

Comment ça, en réalité, le principe est assez simple, non ?

Voici une classe que j'ai réalisée pour afficher la barre de progression :

import sys, time
class ProgressBar:
 def __init__(self, count = 0, total = 0, width = 50):
  self.count = count
  self.total = total
  self.width = width
 def move(self):
  self.count += 1
 def log(self, s):
  sys.stdout.write(' ') * (self.width + 9) + '\r')
  sys.stdout.flush()
  print s
  progress = self.width * self.count / self.total
  sys.stdout.write('{0:3}/{1:3}: '.format(self.count, self.total))
  sys.stdout.write('#') * progress + '-' * (self.width - progress) + '\r')
  if progress == self.width :
   sys.stdout.write('\n')
  sys.stdout.flush()
bar = ProgressBar(total = 10)
for i in range(10) :
 bar.move()
 bar.log('Nous sommes arrivés à : ') + str(i + 1))
 time.sleep(1)

L'effet est le suivant :

De cette manière, vous pouvez facilement vérifier le progrès de l'exécution du programme dans certaines tâches, par exemple, les crawlers, l'apprentissage automatique, etc., qui ne savent pas combien de temps cela prendra, peuvent également avoir une estimation de temps tangible.

Voici tous les codes de mise en œuvre des barres de progression dans la console Python que l'éditeur partage avec vous, j'espère que cela vous servira de référence, et j'espère que vous soutiendrez également le tutoriel d'alarme.

Déclaration : Le contenu de cet article est extrait du réseau, la propriété intellectuelle appartient aux auteurs respectifs, le contenu est soumis et téléversé par les utilisateurs d'Internet, ce site Web ne détient pas de propriété, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de violation de copyright, veuillez envoyer un e-mail à : notice#w pour signaler, et fournir des preuves pertinentes.3Déclaration : Le contenu de cet article est issu du réseau, la propriété intellectuelle appartient aux auteurs respectifs, le contenu est contribué et téléversé par les utilisateurs d'Internet, ce site Web ne détient pas de propriété, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de violation de copyright, veuillez envoyer un e-mail à : notice#w pour signaler, et fournir des preuves pertinentes. Une fois confirmé, ce site supprimera immédiatement le contenu suspect de violation de copyright.

Vous pourriez aussi aimer