59 votes

Comment écrire un indicateur de progression de téléchargement en Python ?

Je suis en train d'écrire une petite application pour télécharger des fichiers par http (comme, par exemple, décrit aquí ).

Je souhaite également inclure un petit indicateur de la progression du téléchargement, indiquant le pourcentage de la progression du téléchargement.

Voici ce que j'ai trouvé :

    sys.stdout.write(rem\_file + "...")    
    urllib.urlretrieve(rem\_file, loc\_file, reporthook=dlProgress)

    def dlProgress(count, blockSize, totalSize):
      percent = int(count\*blockSize\*100/totalSize)
      sys.stdout.write("%2d%%" % percent)
      sys.stdout.write("\\b\\b\\b")
      sys.stdout.flush()

Sortie : MonNomDeFichier... 9%

Avez-vous d'autres idées ou recommandations pour ce faire ?

Une chose qui est quelque peu ennuyeuse est le curseur clignotant dans le terminal sur le premier chiffre du pourcentage. Existe-t-il un moyen d'empêcher cela ? Existe-t-il un moyen de masquer le curseur ?

EDITAR:

Voici une meilleure alternative en utilisant une variable globale pour le nom de fichier dans dlProgress et le ' \r code :

    global rem\_file # global variable to be used in dlProgress

    urllib.urlretrieve(rem\_file, loc\_file, reporthook=dlProgress)

    def dlProgress(count, blockSize, totalSize):
      percent = int(count\*blockSize\*100/totalSize)
      sys.stdout.write("\\r" + rem\_file + "...%d%%" % percent)
      sys.stdout.flush()

Sortie : MonNomDeFichier...9%

Et le curseur apparaît à la FIN de la ligne. C'est beaucoup mieux.

18voto

Readonly Points 48598

Il existe une bibliothèque de barres de progression pour python à l'adresse suivante http://pypi.python.org/pypi/progressbar/2.2 que vous pourriez trouver utile :

Cette bibliothèque fournit une barre de progression en mode texte. Elle est généralement utilisée pour afficher la progression d'une opération de longue durée, en fournissant un indice visuel que le traitement est en cours.

La classe ProgressBar gère la progression, et le format de la ligne est donné par un certain nombre de widgets. Un widget est un objet qui peut s'afficher différemment selon l'état de la progression. Il existe trois types de widgets - une chaîne, qui s'affiche toujours elle-même ; - un ProgressBarWidget, qui peut renvoyer une valeur différente à chaque fois que sa méthode de mise à jour est appelée ; et - un ProgressBarWidgetHFill, qui est comme le ProgressBarWidget, sauf qu'il s'étend pour remplir la largeur restante de la ligne.

Le module de barre de progression est très facile à utiliser, tout en étant très puissant. Il prend automatiquement en charge des fonctions telles que le redimensionnement automatique lorsqu'il est disponible.

15voto

Commodore Jaeger Points 11949

Vous pourriez aussi essayer :

sys.stdout.write("\r%2d%%" % percent)
sys.stdout.flush()

Utiliser un seul retour chariot au début de votre chaîne plutôt que plusieurs retours arrière. Votre curseur clignotera toujours, mais après le signe pour cent plutôt que sous le premier chiffre, et avec un seul caractère de contrôle au lieu de trois, vous obtiendrez moins de scintillement.

4voto

hazzen Points 7315

Si vous utilisez le curses vous avez un contrôle beaucoup plus important de la console. Cela a également un coût plus élevé en termes de complexité du code et n'est probablement pas nécessaire, à moins que vous ne développiez une grande application basée sur la console.

Pour une solution simple, vous pouvez toujours mettre la roue tournante à la fin du message d'état (la séquence de caractères |, \, -, / qui a l'air bien sous un curseur clignotant.

1voto

MichaelvdNet Points 375

J'ai utilisé ce code :

url = (<file location>)
file_name = url.split('/')[-1]
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (file_name, file_size)

file_size_dl = 0
block_sz = 8192
while True:
    buffer = u.read(block_sz)
    if not buffer:
        break

    file_size_dl += len(buffer)
    f.write(buffer)
    status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
    status = status + chr(8)*(len(status)+1)
    print status,

f.close()

0voto

Pour les petits fichiers, il peut être nécessaire d'avoir ces lignes afin d'éviter les pourcentages fous :

sys.stdout.write(" \r %2d%%" % pourcentage)

sys.stdout.flush()

Salud

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X