112 votes

Imprimer sur la même ligne et non sur une nouvelle ligne ?

En fait, je veux faire le contraire de ce que ce type a fait... hehe.

Python script : Imprimer une nouvelle ligne à chaque fois au shell plutôt que de mettre à jour la ligne existante

J'ai un programme qui me dit où en est le projet.

for i in some_list:
    #do a bunch of stuff.
    print i/len(some_list)*100," percent complete"

Ainsi, si len(some_list) est 50, la dernière ligne sera imprimée 50 fois. Je veux imprimer une ligne et continuer à la mettre à jour. Je sais que c'est probablement la question la plus nulle que vous lirez de toute la journée. Mais je n'arrive pas à trouver les quatre mots que je dois entrer dans Google pour obtenir la réponse.

Mise à jour ! J'ai essayé la suggestion de mvds qui semblait correcte. Le nouveau code

print percent_complete,"           \r",

Percent complete est juste une chaîne de caractères (j'ai fait une abstraction la première fois, maintenant j'essaie d'être littéral). Le résultat est qu'il exécute le programme, n'imprime RIEN jusqu'à ce que le programme soit terminé, et imprime ensuite "100 pour cent terminé" sur une et une seule ligne.

Sans le retour chariot (mais avec la virgule, la moitié de la suggestion de mvds), il n'imprime rien jusqu'à la fin. Et ensuite, il imprime :

0 percent complete     2 percent complete     3 percent complete     4 percent complete    

Et ainsi de suite. Le nouveau problème, c'est qu'avec la virgule, le programme ne s'imprime pas tant qu'il n'est pas terminé.

Avec le retour chariot et sans virgule, le comportement est exactement le même que sans retour chariot ni virgule.

91voto

mvds Points 26475

Il s'agit du retour chariot, ou \r

Utilisation

print i/len(some_list)*100," percent complete         \r",

La virgule empêche l'impression d'ajouter une nouvelle ligne. (et les espaces garderont la ligne claire par rapport à la sortie précédente)

N'oubliez pas non plus de terminer par un print "" pour obtenir au moins une nouvelle ligne finale !

39voto

Remi Points 4223

A partir de python 3.x, vous pouvez faire :

print('bla bla', end='')

(qui peut également être utilisé dans Python 2.6 ou 2.7 en mettant from __future__ import print_function au début de votre script/module)

Exemple de barre de progression de la console Python :

import time

# status generator
def range_with_status(total):
    """ iterate from 0 to total and show progress in console """
    n=0
    while n<total:
        done = '#'*(n+1)
        todo = '-'*(total-n-1)
        s = '<{0}>'.format(done+todo)
        if not todo:
            s+='\n'        
        if n>0:
            s = '\r'+s
        print(s, end='')
        yield n
        n+=1

# example for use of status generator
for i in range_with_status(10):
    time.sleep(0.1)

39voto

dlchambers Points 882

Pour moi, ce qui a fonctionné, c'est une combinaison des réponses de Remi et de siriusd :

from __future__ import print_function
import sys

print(str, end='\r')
sys.stdout.flush()

38voto

LeopardShark Points 161

Dans Python 3.3+, vous n'avez pas besoin de sys.stdout.flush() . print(string, end='', flush=True) œuvre.

Donc

print('foo', end='')
print('\rbar', end='', flush=True)

remplacera "foo" par "bar".

13voto

siriusd Points 31

Pour la console, vous aurez probablement besoin de

sys.stdout.flush()

pour forcer la mise à jour. Je pense que l'utilisation de , en impression bloquera la vidange de stdout et, d'une manière ou d'une autre, il ne mettra pas à jour le fichier

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