Retour chariot inopérant en Python

a marqué ce sujet comme résolu.

Bonjour,

J’essaye, pour un projet de stéganographie qui met du temps à s’exécuter, d’afficher au fur et à mesure que le programme la proportion de données traitées.

J’aimerais bien pouvoir le faire sur une seule ligne sur laquelle je réécris à nouveau plutôt que de passer à la ligne suivante à chaque fois…

Pour ça j’ai pensé utiliser un retour chariot '\r’, mais je n’arrive pas à le faire fonctionner correctement (il agit comme un "\n")…

Même l’exemple d’un tutoriel que j’ai trouvé en ligne sur le sujet ne s’est pas exécuté correctement…

Pourriez-vous m’aider ?

Merci d’avance,

@flopy78

Salut!

Par défaut, la commande print de python met un retour à la ligne automatiquement à la fin de la chaîne de caractères. En fait, elle possède un argument "mot-clé" end qui par défaut vaut "\n".

Tu peux redéfinir ce caractères de retour en changeant cet argument en donnant l’option end à ta fonction print. Voici quelques exemples, le ^ sur la ligne en dessous montre où se trouve le curseur. Pour ton problème, il faut que tu déplace le "\r" de ta chaîne de caractère à l’argument end du print.

>>> print("coucou", end=".")
coucou.
       ^
>>> print("salut")  # sous entendu, print("salut", end="\n")
salut

^
>>> print("avancement", end="\r")
avancement
^
>>> print("avancement\r")
avancement

^

Je t’invite à reqarder la document de print pour avoir toutes les infos sur ces arguments. Les arguments sep, file et flush peuvent être très intéressants à l’occasion.

Pour en savoir plus sur les "keyword arguments", tu as cette partie dans le cours "Un Zeste de python".

+5 -0

Je me permets d’insister sur le paramètre flush rapidement mentionné. Si tu définies le paramètre end sur quelque chose ne comportant pas de retour à la ligne, ce que tu veux a priori, tu observeras qu’il semblera ne pas fonctionner… ou que tout s’affichera d’un coup, à la fin.

C’est un comportement du terminal, qui n’affiche les lignes de textes qu’on lui envoie qu’une fois un retour à la ligne atteint. On parle de buffering.

Or ce n’est pas ce qu’on veut, on veut l’affichage en temps réel ! C’est pour ça qu’on a l’attribut flush, qui demande au terminal d’afficher ce qui est “en attente” immédiatement, sans attendre de retour à la ligne.

On peut comparer le comportement dans ce script affichant un compte à rebours :

  • d’abord sans flush : tout sera affiché d’un coup après le compte à rebours, une fois un retour à la ligne atteint — retour à la ligne affiché par le dernier print de la première partie, ligne 7 ;
  • puis avec : ce sera bien affiché au fur et à mesure.
from time import sleep

print("Sans flush")
for second in range(3, 0, -1):
    print(second, end=" ")
    sleep(1)
print("Go!")

sleep(1)  # ---------------

print()
print("Avec flush")
for second in range(3, 0, -1):
    print(second, end=" ", flush=True)
    sleep(1)
print("Go!")
+3 -0

On peut utiliser le "\r" dans un contexte comme celui-ci:

from time import sleep
for s in range(10):
    print("\rSalut", s, end="", flush=True)
    sleep(1)
print()

Tout va s’afficher sur la même ligne en effaçant la ligne précédente jusqu’à la longueur de la dernière ligne.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte