175 votes

Comment écraser l'impression précédente vers stdout ?

Si j'avais le code suivant :

for x in range(10):
     print x

J'obtiendrais le résultat suivant

1
2
etc..

Ce que je voudrais faire, c'est qu'au lieu d'imprimer une nouvelle ligne, je veux remplacer la valeur précédente et l'écraser avec la nouvelle valeur sur la même ligne.

1 votes

2 votes

Par ailleurs, assurez-vous d'obtenir la réponse qui permet d'effacer toute la ligne si la ligne précédente est effacée. plus longtemps que la ligne actuelle.

226voto

Mike DeSimone Points 20059

Version simple

Une façon de procéder est d'utiliser le retour chariot ( '\r' ) pour revenir au début de la ligne sans passer à la ligne suivante.

Python 3

for x in range(10):
    print(x, end='\r')
print()

Compatible avec Python 2.7

from __future__ import print_function
for x in range(10):
    print(x, end='\r')
print()

Python 2.7

for x in range(10):
    print '{}\r'.format(x),
print

Python 2.0-2.6

for x in range(10):
    print '{0}\r'.format(x),
print

Dans les deux derniers cas (uniquement pour Python 2), la virgule à la fin de l'instruction print lui indique de ne pas passer à la ligne suivante. La dernière instruction print avance à la ligne suivante afin que votre invite n'écrase pas votre sortie finale.

Nettoyage des lignes

Si vous ne pouvez pas garantir que la nouvelle ligne de texte n'est pas plus courte que la ligne existante, il vous suffit d'ajouter une séquence d'échappement "clear to end of line", '\x1b[1K' ( '\x1b' = ESC) :

for x in range(75):
    print('*' * (75 - x), x, end='\x1b[1K\r')
print()

0 votes

Cela fonctionne, mais je ne comprends pas certaines parties... '{0}' et .format

8 votes

Cela a été introduit dans Python 2.6 et (d'après ce que l'on m'a dit) c'est la manière standard de formater les chaînes de caractères dans Python 3 ; la fonction % est déprécié. Fondamentalement, toutes les chaînes de caractères ont maintenant un format méthode. Dans ce cas, le {0} signifie "le premier argument de format() "(le comptage commence à 0).

0 votes

Ce n'est pas une option si vous devez utiliser un logiciel exclusivement Windows et que vous n'avez pas les couilles de faire tourner une VM.

112voto

Pascal Points 8222

Comme j'ai atterri ici via Google mais que j'utilise Python 3, voici comment cela fonctionnerait dans Python 3 :

for x in range(10):
    print("Progress {:2.1%}".format(x / 10), end="\r")

Réponse connexe ici : Comment supprimer la nouvelle ligne après une instruction d'impression ?

4 votes

J'ai essayé et ça marche plutôt bien. Le seul problème est qu'il n'efface pas la sortie antérieure sur cette ligne, par exemple : si votre première boucle imprime testing et votre deuxième boucle imprime test la sortie après la deuxième passe sera toujours testing - Je vois maintenant que @Nagasaki45 l'a signalé.

20 votes

Dans un cahier d'ipython, je dois faire : print("\r", message, end="")

2 votes

Cette méthode fonctionne très bien, elle n'efface pas la ligne mais l'utilisation d'un nombre suffisant d'espaces dans l'impression suivante fait l'affaire (bien que ce ne soit pas élégant). Un commentaire que je pourrais ajouter est que cela ne fonctionne pas dans la console de débogage de VS Code, mais cela fonctionne dans le terminal.

35voto

Nagasaki45 Points 143

Réponse de @Mike DeSimone fonctionnera probablement la plupart du temps. Mais...

for x in ['abc', 1]:
    print '{}\r'.format(x),

-> 1bc

Cela s'explique par le fait que le '\r' ne fait que revenir au début de la ligne mais n'efface pas la sortie.

Si le support POSIX vous suffit, la commande suivante efface la ligne en cours et laisse le curseur au début de celle-ci :

print '\x1b[2K\r',

Il utilise le code d'échappement ANSI pour effacer la ligne du terminal. Plus d'informations peuvent être trouvées dans wikipedia et en cette grande discussion .

Autre approche

L'autre solution (sans doute pire) que j'ai trouvée ressemble à ceci :

last_x = ''
for x in ['abc', 1]:
    print ' ' * len(str(last_x)) + '\r',
    print '{}\r'.format(x),
    last_x = x

-> 1

L'un des avantages est qu'il fonctionne également sous Windows.

1 votes

J'ai créé une fonction à partir de l'"ancienne réponse" qui fonctionne correctement (même sous Windows), voir ma réponse : stackoverflow.com/a/43952192/965332

18voto

Supprimez la nouvelle ligne et imprimez \r .

print 1,
print '\r2'

ou écrire sur stdout :

sys.stdout.write('1')
sys.stdout.write('\r2')

-2voto

Trent Points 226

Vous pourriez imprimer le nombre, puis effacer l'écran soit avec une fonction spéciale, soit avec une boucle pour imprimer un nombre x de lignes vides, puis imprimer votre nouveau nombre, mais ces deux méthodes ne sont pas recommandées :)

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