web-dev-qa-db-fra.com

Python: plusieurs impressions sur la même ligne

Je veux exécuter un script qui montre de manière simple des choses comme:

Installing XXX...               [DONE]

Maintenant, pour le moment, j'utilise print pour imprimer toute la ligne APRÈS que la fonction ait réussi. Cependant, je souhaite maintenant que le message "Installation de xxx ..." soit imprimé en premier, et APRES que la fonction ait été exécutée, pour ajouter la balise "DONE"; mais sur la même ligne.

Des idées?

204
user697108

Vous pouvez utiliser l'instruction print pour le faire sans importer sys.

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

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

La solution Python
Puisque ce qui précède ne fonctionne pas dans Python 3, vous pouvez le faire à la place (encore une fois, sans importer sys):

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

La fonction d'impression accepte un paramètre end dont le paramètre par défaut est "\n". Le définir sur une chaîne vide l'empêche d'émettre une nouvelle ligne à la fin de la ligne.

258

Vous pouvez simplement utiliser ceci:

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

et la sortie sera

something else

inutile de surcharger de import sys. Faites attention à la virgule à la fin.

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

102
boldnik

Vous devez utiliser un retour arrière '\r ' ou ('\x08 ' ) char 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()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

Python 3:

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

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

> python test.py
100%

Des informations supplémentaires sur flush dans ce cas ici: Pourquoi python les instructions print contenant les arguments 'end =' se comportent-elles différemment dans les boucles while??

44
Vadim Zin4uk

Utilisez sys.stdout.write('Installing XXX... ') et sys.stdout.write('Done'). De cette façon, vous devez ajouter la nouvelle ligne à la main avec "\n" si vous souhaitez recréer la fonctionnalité d'impression. Je pense qu'il serait peut-être inutile d'utiliser des malédictions rien que pour ça.

43
ferostar

Aucune des réponses n'a fonctionné pour moi, car ils ont tous fait une pause jusqu'à ce qu'une nouvelle ligne a été rencontrée. J'ai écrit une aide simple:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

Pour le tester:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

"Bonjour" sera d'abord imprimé et affiché à l'écran avant le sommeil. Après cela, vous pouvez utiliser une impression standard.

16
incognick

sys.stdout.write imprimera sans chariot de retour

import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")

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

14
John Giotta

Cet exemple simple imprimera 1-10 sur la même ligne.

for i in range(1,11):
    print (i, end=" ")
8
Umali Leonard

L'impression a un argument de fin optionnel, c'est ce qui a été imprimé à la fin. La valeur par défaut est newline mais vous pouvez le changer en chaîne vide. par exemple: print ("hello world!", end = "")

7
TulkinRB

Le plus simple:

Python 3

    print(‘\r’+’something to be override’,end=‘’)

Cela signifie que le curseur reviendra au début, puis imprimera quelque chose et se terminera sur la même ligne. S'il est en boucle, il commencera à imprimer au même endroit.

6
Octavius

Si vous souhaitez écraser la ligne précédente (au lieu de l'ajouter continuellement), vous pouvez combiner \r avec print(), à la fin de l'instruction d'impression. Par exemple,

from time import sleep

for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)

print("...DONE!")

comptera de 0 à 9, remplaçant l’ancien numéro dans la console. Le "...DONE!" imprimera sur la même ligne que le dernier compteur, 9.

Dans le cas de l'OP, cela permettrait à la console d'afficher le pourcentage d'achèvement de l'installation sous la forme d'une "barre de progression" dans laquelle vous pouvez définir la position des caractères de début et de fin et mettre à jour les marqueurs entre les deux.

print("Installing |XXXXXX              | 30%"),
4
Brian Bunker

Voici une version compatible 2.7 dérivée de la version 3.0 de @ Vadim-Zin4uk:

Python 2

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}\r'.format(s),                # just print and flush

    time.sleep(0.2)

D'ailleurs, la solution 3.0 fournie semble un peu gonflée. Par exemple, la méthode de retour arrière n'utilise pas l'argument entier et pourrait probablement être supprimée complètement.

Python

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}\r'.format(s), end='')        # just print and flush

    time.sleep(0.2)                         # sleep for 200ms

Les deux ont été testés et fonctionnent.

3
Dannid

C'est un très vieux sujet, mais voici une réponse très complète et un exemple de code.

\r est la représentation sous forme de chaîne de retour à la ligne à partir du jeu de caractères ASCII. C'est la même chose que 015 [chr(0o15)] ou hexidécimal 0d [chr(0x0d)] ou décimal 13 [chr(13)]. Voir man ascii pour une lecture ennuyeuse. Il (\r) est une représentation assez portable et assez facile à lire. Il s’agit tout simplement de déplacer le chariot de la machine à écrire jusqu’au début sans faire avancer le papier. C'est la CR partie de CRLF qui signifie retour chariot et saut de ligne.

print() est une fonction dans Python 3. Dans Python 2 (toute version que vous souhaiteriez utiliser), print peut être forcé dans une fonction en important son définition du module __future__. L'avantage de la fonction print est que vous pouvez spécifier quoi imprimer à la fin, en remplaçant le comportement par défaut de \n pour imprimer une nouvelle ligne à la fin de chaque appel print().

sys.stdout.flush indique à Python de vider la sortie de sortie standard, à l'endroit où vous envoyez la sortie avec print(), sauf indication contraire. Vous pouvez également obtenir le même comportement en utilisant python -u ou en définissant la variable d'environnement PYTHONUNBUFFERED=1, en ignorant ainsi les appels import sys et sys.stdout.flush(). Le montant que vous gagnez en faisant cela est presque exactement zéro et il n'est pas très facile de déboguer si vous oubliez facilement que vous devez effectuer cette étape avant que votre application ne se comporte correctement.

Et un échantillon. Notez que cela fonctionne parfaitement dans Python 2 ou 3.

from __future__ import print_function

import sys
import time

ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}

for i in range(1, ANS + 1):
    if i in FACTORS:
        print('\r{0:d}'.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()
2
Chris Cosby

Juste au cas où vous avez pré-stocké les valeurs dans un tableau, vous pouvez les appeler au format suivant:

for i in range(0,n):
       print arr[i],
1
k20392

print () a un paramètre intégré "end" qui est défini par défaut sur "\ n" L'appel de print ("This is America") appelle en fait print ("This is America", end = "\ n"). Une façon simple de faire est d'appeler print ("This is America", end = "")

1
Miles Mbo