282 votes

Comment puis-je imprimer plusieurs choses sur la même ligne, une à la fois?

Je veux exécuter un script, qui montre essentiellement une sortie comme ceci :

Installation de XXX...               [TERMINÉ]

Actuellement, j'imprime Installation de XXX... d'abord, puis j'imprime [TERMINÉ].

Comment puis-je plutôt imprimer Installation de xxx... et [TERMINÉ] sur la même ligne ?


Pour le problème spécifique d'écrire un nouveau message sur la même ligne, en <strong>remplaçant ce qui était là avant</strong>, veuillez consulter <a href="https://stackoverflow.com/questions/5419389">Comment écraser l'affichage précédent vers stdout?</a>. <strong>La plupart</strong> des réponses interprètent la question comme étant sur l'écriture d'un nouveau texte <strong>à la fin</strong> de la ligne actuelle.

Pour le problème d'utiliser un seul <code>print</code> pour afficher plusieurs choses à la fois, voir <a href="https://stackoverflow.com/questions/15286401/">Comment puis-je imprimer plusieurs choses (texte fixe et/ou valeurs de variables) sur la même ligne, tout en une fois?</a>.

2 votes

1 votes

Les réponses à cette question ne mentionnent pas que parfois vous voulez effacer la ligne, voir : stackoverflow.com/questions/45263205

333voto

multipleinterfaces Points 2917

Solution Python 3

La fonction print() accepte un paramètre end qui est par défaut \n (nouvelle ligne). En le définissant comme une chaîne vide, on évite qu'une nouvelle ligne soit ajoutée à la fin de la ligne.

def installer_xxx():
    print("Installation de XXX...      ", end="", flush=True)

installer_xxx()
print("[TERMINÉ]")

Solution Python 2

Ajouter une virgule à la fin de la ligne print() empêche print() d'ajouter une nouvelle ligne (notez qu'il y aura un espace supplémentaire à la fin de la sortie).

def installer_xxx():
   print "Installation de XXX...      ",

installer_xxx()
print "[TERMINÉ]"

2 votes

Cela fonctionne parfaitement. J'avais seulement vu des solutions stdout jusqu'à présent. Vraiment bon à savoir cela.

5 votes

Cela ne fonctionne pas si vous avez à la fois des impressions et une action chronophage entre les deux (le tout dans la même fonction / niveau d'indentation). Avant le début de l'action, il n'y a pas de sortie du tout et après qu'elle est terminée, la sortie apparaît en entier

2 votes

C'est probablement plus une fonction de l'output buffering effectué par le système d'exploitation pour le processus dans son ensemble, ce n'est pas un problème spécifique à Python. Consultez stackoverflow.com/questions/107705 pour une solution de contournement spécifique à Python.

110voto

boldnik Points 424

Vous pouvez simplement utiliser ceci :

print 'something',
...
print ' else',

et la sortie sera

quelque chose d'autre

pas besoin d'en faire trop avec import sys. Faites attention au symbole de virgule à la fin.

Python 3+ print("some string", end=""); pour supprimer l'insertion de nouvelle ligne à la fin. En savoir plus en help(print);

3 votes

Veuillez noter qu'il y a deux espaces en utilisant cette méthode

1 votes

Voici la réponse la plus simple et la plus efficace.

0 votes

Cela ne fonctionne pas lorsque les arguments de print sont entre parenthèses. Cela fonctionne: mais cela ne fonctionne pas

68voto

Vous devriez utiliser la touche de retour arrière '\r' ou le caractère ('\x08') pour revenir à la position précédente dans la sortie de la console

Python 2+:

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # utiliser le caractère \x08 pour revenir   

for i in range(101):                        # de 0 à 100
    s = str(i) + '%'                        # chaîne à afficher
    sys.stdout.write(s)                     # juste imprimer
    sys.stdout.flush()                      # nécessaire pour vider le tampon lors de l'utilisation de \x08
    backspace(len(s))                       # revenir en arrière de n caractères    
    time.sleep(0.2)                         # pause de 200ms

Python 3:

import time   

def backline():        
    print('\r', end='')                     # utiliser '\r' pour revenir

for i in range(101):                        # de 0 à 100
    s = str(i) + '%'                        # chaîne à afficher
    print(s, end='')                        # simplement imprimer et vider
    backline()                              # revenir au début de la ligne    
    time.sleep(0.2)                         # pause de 200ms

Ce code comptera de 0% à 100% sur une seule ligne. La valeur finale sera:

> python test.py
100%

Informations supplémentaires sur le vidage dans ce cas ici: Pourquoi les instructions d'impression python contenant des arguments 'end=' se comportent-elles différemment dans les boucles while ?

1 votes

Pour clarifier, il semble que le code mis en commentaire dans cet exemple soit pour Python 2, et les lignes non commentées sont pour Python 3.

1 votes

Bouth lines will work fine in Python 3. If you use '\x08' as a backspace you need to flush the output stream - print((b'\x08' * n).decode(), end='', flush=True)

1 votes

Le retour chariot '\r' revient au début de la ligne, donc le '* n' est inutile

42voto

ferostar Points 4822

Utilisez sys.stdout.write('Installation de XXX... ') et sys.stdout.write('Terminé'). De cette façon, vous devez ajouter la nouvelle ligne manuellement avec "\n" si vous voulez recréer la fonction d'impression. Je pense qu'il pourrait être inutile d'utiliser curses juste pour cela.

4 votes

Je préfère personnellement cette solution à celle ayant reçu le plus de votes car elle fonctionne de la même manière sur python2.x et python3.x sans avoir besoin de s'appuyer sur des importations __future__ ou autre chose de ce genre.

14voto

John Giotta Points 5606

sys.stdout.write affichera sans retour à la ligne

import sys
sys.stdout.write("installation de xxx")
sys.stdout.write(".")

http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines

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