Si j'avais le code suivant:
for x in range(10):
print x
J'aurais la sortie de
1
2
etc..
Ce que je voudrais faire, c'est 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.
Réponses:
Une méthode consiste à utiliser le caractère retour chariot (
'\r'
) pour revenir au début de la ligne sans passer à la ligne suivante:La virgule à la fin de l'instruction d'impression lui indique de ne pas passer à la ligne suivante. La dernière instruction d'impression passe à la ligne suivante afin que votre invite n'écrase pas votre sortie finale.
Mettre à jour
Maintenant que Python 2 est EOL, une réponse Python 3 a plus de sens. Pour Python 3.5 et versions antérieures:
Dans Python 3.6 et versions ultérieures, les f-strings se lisent mieux:
la source
%
opérateur est obsolète. Fondamentalement, toutes les chaînes ont maintenant une méthode de format . Dans ce cas, le{0}
signifie "le premier argument àformat()
" (le comptage commence à 0).re.sub(r'\$<\d+>[/*]?', '', curses.tigetstr('el') or '')
vous donnera la chaîne d'effacement à la fin de ligne correcte pour le terminal de l'utilisateur. N'oubliez pas d'initialisercurses
avec quelque chose commecurses.setupterm(fd=sys.stdout.fileno())
, et utilisezsys.stdout.isatty()
pour vous assurer que votre sortie n'est pas redirigée vers un fichier. Voir code.activestate.com/recipes/475116 pour un module Python complet avec contrôle du curseur et prise en charge des couleurs.import curses; curses.setupterm(fd=sys.stdout.fileno()); print(hex(curses.tigetstr('cr')));
Il devrait imprimer les codes hexadécimaux de la séquence de caractères pour aller au début de la ligne.Puisque je me suis retrouvé ici via Google mais que j'utilise Python 3, voici comment cela fonctionnerait dans Python 3:
Réponse connexe ici: Comment puis-je supprimer la nouvelle ligne après une instruction d'impression?
la source
testing
et votre deuxième impression en boucle,test
la sortie après la deuxième passe sera toujourstesting
- maintenant je vois que @ Nagasaki45 l'a soulignéprint("\r", message, end="")
La réponse @Mike DeSimone fonctionnera probablement la plupart du temps. Mais...
Ceci est dû au fait que le
'\r'
seul retourne au début de la ligne mais n'efface pas la sortie.EDIT: meilleure solution (que mon ancienne proposition ci-dessous)
Si le support POSIX vous suffit, ce qui suit effacera la ligne courante et laisserait le curseur à son début:
Il utilise le code d'échappement ANSI pour effacer la ligne du terminal. Plus d'informations peuvent être trouvées dans wikipedia et dans ce grand discours .
Ancienne réponse
La solution (pas si bonne) que j'ai trouvée ressemble à ceci:
Un avantage est qu'il fonctionnera également sur Windows.
la source
J'avais la même question avant de visiter ce fil. Pour moi, le sys.stdout.write ne fonctionnait que si je vidais correctement le tampon ie
Sans vidage, le résultat est imprimé uniquement à la fin du script
la source
stringvar.ljust(10,' ')
dans le cas de chaînes de longueur variable.Supprimez la nouvelle ligne et imprimez
\r
.ou écrivez dans stdout:
la source
Essaye ça:
Cela a fonctionné pour moi. La
end="\r"
pièce lui fait écraser la ligne précédente.AVERTISSEMENT!
Si vous imprimez
hi
, puis imprimez enhello
utilisant\r
, vous obtiendrezhillo
parce que la sortie a écrit sur les deux lettres précédentes. Si vous imprimezhi
avec des espaces (qui n'apparaissent pas ici), alors il sortirahi
. Pour résoudre ce problème, imprimez les espaces à l'aide de\r
.la source
Hi BobHi BobHi BobHi BobHi Bob
. Python 3.7.1\r
c'est au début plutôt qu'à la fin.Je ne pouvais faire fonctionner aucune des solutions de cette page pour IPython , mais une légère variation de la solution de @ Mike-Desimone a fait le travail: au lieu de terminer la ligne avec le retour chariot, commencez la ligne avec le retour chariot:
En outre, cette approche ne nécessite pas la deuxième instruction d'impression.
la source
time.sleep (0.5) est de montrer comment la sortie précédente est effacée et la nouvelle sortie est imprimée "\ r" quand elle est au début du message d'impression, elle va effacer la sortie précédente avant la nouvelle sortie.
la source
Cela fonctionne sur Windows et python 3.6
la source
La réponse acceptée n'est pas parfaite . La ligne qui a été imprimée en premier y restera et si votre deuxième impression ne couvre pas toute la nouvelle ligne, vous vous retrouverez avec du texte de garbage.
Pour illustrer le problème, enregistrez ce code en tant que script et exécutez-le (ou jetez-y simplement un œil):
La sortie ressemblera à ceci:
Ce qui fonctionne pour moi, c'est d'effacer la ligne avant de laisser une impression permanente. N'hésitez pas à vous adapter à votre problème spécifique:
Et maintenant, il imprime comme prévu:
la source
Voici une version plus propre et plus "plug-and-play" de la réponse de @ Nagasaki45. Contrairement à beaucoup d'autres réponses ici, cela fonctionne correctement avec des chaînes de différentes longueurs. Il y parvient en effaçant la ligne avec autant d'espaces que la longueur de la dernière ligne imprimée. Fonctionnera également sous Windows.
Usage
Utilisez-le simplement comme ceci:
Ce petit test montre que les lignes sont correctement effacées, même pour des longueurs différentes:
la source
Je suis un peu surpris que personne n'utilise le caractère de retour arrière. En voici un qui l'utilise.
la source
sys.stdout.flush()
(Python3) C'est ce qui a fonctionné pour moi. Si vous utilisez simplement le \ 010, il laissera des caractères, alors je l'ai légèrement modifié pour m'assurer qu'il écrasait ce qui était là. Cela vous permet également d'avoir quelque chose avant le premier élément d'impression et de supprimer uniquement la longueur de l'élément.
la source
Encore une réponse basée sur les réponses précédentes.
Contenu de pbar.py: import sys, shutil, datetime
Utilisation du script:
la source
Voici ma solution! Windows 10, Python 3.7.1
Je ne sais pas pourquoi ce code fonctionne, mais il efface complètement la ligne d'origine. Je l'ai compilé à partir des réponses précédentes. Les autres réponses ne feraient que ramener la ligne au début, mais si vous aviez une ligne plus courte par la suite, elle aurait l'air foirée comme
hello
se transforme enbyelo
.Sortie - Chaque ligne sera réécrite sans aucun ancien texte montrant:
Ligne suivante (complètement réécrite sur la même ligne):
la source
Mieux vaut écraser toute la ligne sinon la nouvelle ligne se mélangera avec les anciennes si la nouvelle ligne est plus courte.
Dû utiliser
columns - 1
sur Windows.la source