J'écris un téléchargeur FTP. Une partie du code est quelque chose comme ceci:
ftp.retrbinary("RETR " + file_name, process)
J'appelle le processus de fonction pour gérer le rappel:
def process(data):
print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!'
file.write(data)
et la sortie est quelque chose comme ceci:
1784 KB / KB 1829 downloaded!
1788 KB / KB 1829 downloaded!
etc...
mais je veux qu'il imprime cette ligne et la réimprime / actualise la prochaine fois pour qu'il ne l'affiche qu'une seule fois et je verrai la progression de ce téléchargement.
Comment ceci peut être fait?
python
refresh
progress-bar
Kristian
la source
la source
Réponses:
Voici le code pour Python 3.x:
Le
end=
mot-clé est ce qui fait le travail ici - par défaut,print()
se termine par un caractère newline (\n
), mais cela peut être remplacé par une chaîne différente. Dans ce cas, terminer la ligne par un retour chariot ramène le curseur au début de la ligne courante. Ainsi, il n'est pas nécessaire d'importer lesys
module pour ce type d'utilisation simple.print()
a en fait un certain nombre d'arguments de mots clés qui peuvent être utilisés pour simplifier considérablement le code.Pour utiliser le même code sur Python 2.6+, placez la ligne suivante en haut du fichier:
la source
from __future__ import print_function
.print "foo",
Cependant, vous devez encore vider après cela pour voir le changement:sys.stdout.flush()
\r
au début de la chaîne, et définir à laend=''
place pour que cela fonctionne. Je ne pense pas que mon terminal aime ça quand je termine avec\r
flush=True
à laprint()
fonction pour vous assurer que la mémoire tampon est vidée (la mémoire tampon de ligne standard ne se viderait que lorsqu'une\n
nouvelle ligne est écrite).\r
au début et aend=''
fonctionné le mieux et le plus facilement. Utiliserflush=True
avec\r
à la fin si la chaîneend='\r'
fonctionnait également mais n'était pas lisse et effaçait la ligne et son saut de ligne.Si tout ce que vous voulez faire est de changer une seule ligne, utilisez
\r
.\r
signifie retour chariot. Son effet est uniquement de remettre le curseur au début de la ligne actuelle. Cela n'efface rien. De même,\b
peut être utilisé pour reculer d'un caractère. (certains terminaux peuvent ne pas prendre en charge toutes ces fonctionnalités)la source
\r
signifie le retour chariot. son effet est uniquement de remettre le curseur au début de la ligne courante. il n'efface rien. de même,\b
peut être utilisé pour reculer d'un caractère. (certains terminaux peuvent ne pas prendre en charge toutes ces fonctionnalités)sys.stdout.write('%s\r', size_str')
Je pense que vous vouliez diresys.stdout.write('%s\r' % size_str)
mais cela ne fonctionne pas.print
place desys.stdout.write
si vous préférez:print size_str + "\r",
fonctionne bien. Le,
à la fin de l'instruction d'impression supprime la nouvelle ligne;sys.stdout.flush()
est encore nécessaireJetez un œil à la documentation du module curses et au HOWTO du module curses .
Exemple vraiment basique:
la source
clrtoeol
pour quand la deuxième ligne est plus courte que la première.Voici ma petite classe qui peut réimprimer des blocs de texte. Il efface correctement le texte précédent afin que vous puissiez écraser votre ancien texte avec un nouveau texte plus court sans créer de désordre.
la source
J'ai trouvé que pour une simple instruction print en python 2.7, il suffit de mettre une virgule à la fin après votre
'\r'
.C'est plus court que les autres solutions non-python 3, mais aussi plus difficile à maintenir.
la source
Vous pouvez simplement ajouter '\ r' à la fin de la chaîne plus une virgule à la fin de la fonction d'impression. Par exemple:
la source
end
paramètre par défaut défini sur\n
donc u imprimer(...)KB downloaded!\r\n
. Ai-je tort?end = '\r'
place corrige le problème dans Python 3.J'utilise spyder 3.3.1 - windows 7 - python 3.6 bien que le flush ne soit pas nécessaire. basé sur cette publication - https://github.com/spyder-ide/spyder/issues/3437
la source
pour écraser la ligne précédente en python, tout ce dont vous avez besoin est d'ajouter end = '\ r' à la fonction d'impression, testez cet exemple:
la source