2010-07-25 6 views
3

Que signifie '\ r'? Qu'est ce que ça fait? Je ne l'ai jamais vu auparavant et cela me donne des maux de tête. Il ne semble pas avoir de but, puisque 'a \ ra' s'imprime comme 'aa', mais ce n'est pas la même chose que la chaîne 'aa'. Im using python 2.6Qu'est-ce que cela signifie?

+0

FYI aux autres Googleurs - Sous Windows, je reçois un '' \ r'' quand je lis stdout depuis un processus appelé avec le module 'subprocessing', mais quand je lis depuis stdin dans le processus, le' '\ r' 'n'est pas là. –

Répondre

10

C'est un vieux caractère de contrôle des machines à écrire. Cela signifie "retour chariot". À ce moment-là, lorsque vous avez appuyé sur «Entrée», vous alliez à la ligne suivante, puis le chariot est revenu au début de la ligne (d'où le retour chariot). Ensuite, avec les ordinateurs, différents systèmes d'exploitation ont fait des choix différents pour représenter les nouvelles lignes. Sur les fenêtres, vous avez "\ r \ n" (retour chariot + nouvelle ligne). Sur les unices, vous avez "\ n" seulement (pas besoin de faire un retour chariot, c'était en quelque sorte impliqué par la nouvelle ligne). Sur ancien système d'exploitation Mac, vous n'aviez "\ r" que.

De nos jours, il n'est pas utilisé sauf pour les nouvelles lignes (ou je ne connais pas d'autres utilisations).

+7

Il est parfois utilisé pour afficher un indicateur de progression de mise à jour sur une ligne: 'printf (" 1 %% "); fflush (stdout); dormir (1); printf ("\ r2 %%"); '. Le premier printf laisse le curseur à la fin de la ligne. Le second printf utilise '\ r' pour ramener le curseur au début de la ligne, puis remplace le' 1% 'par' 2% '. –

+0

Oh oui, j'ai oublié ça :-) – Scharron

1

C'est l'évasion pour le retour chariot. Sur ma console, fonctionnant sous Windows, print 'a\ra' résultats dans ...

a 
a 

... s'imprimé à stdout. Voici une liste de all valid escapes.

  • \newline - Ignoré
  • \\ - Backslash()
  • \' - Apostrophe (')
  • \" - Guillemet (")
  • \a - ASCII Bell (BEL)
  • \b - Retour arrière ASCII (BS)
  • \f - ASCII Formfeed (FF)
  • \n - ASCII Linefeed (LF)
  • \N{name} - Caractère appelé nom dans la base de données Unicode (Unicode seulement)
  • \r - ASCII de retour chariot (CR)
  • \t - ASCII horizontal (TAB)
  • \uxxxx - Caractère avec
  • \Uxxxxxxxx xxxx (Unicode seulement) de valeur hexadécimale 16 bits - caractère avec la valeur hexadécimale 32-bit xxxxxxxx (Unicode seulement)
  • \v - ASCII vertical Tab (VT)
  • \ooo - Caractère avec la valeur octal ooo
  • \xhh - caractère avec valeur hexadécimale hh
+0

'imprimer 'a \ ra'' sous Windows me donne juste un' a'. Le retour chariot sans nouvelle ligne fait que le second écrase le premier. – FogleBird

+1

Cela dépend de la façon dont votre console interprète la séquence de contrôle, je suppose. Un bon argument pour toujours utiliser 'repr' quand vous déboguez, et éviter les caractères de contrôle autant que possible si vous ne le faites pas. –

8

Pour moi (sur un Mac OS X 10.5 Terminal.App, Python 2.6.5):

>>> print 'a\ra' 
a 

ou pour donner un meilleur exemple:

>>> print 'longstring\rshort' 
shorttring 

OIEau, le \r « renvoie le curseur au début de la ligne » (sans lancer une nouvelle longue) de sorte que 'short' " écrase "le début de 'longstring'. Cet effet est sympa de montrer à l'utilisateur qu'un "état actuel" d'une ligne est en cours de mise à jour pendant une longue opération - utilisez print '\rupdate', avec une virgule flottante pour éviter d'émettre un caractère de nouvelle ligne, pour mettre à jour le statut en écrasant le précédent. Bien sûr, vous devez vous assurer que chaque chaîne mise à jour ainsi montrée est au moins aussi longue que la précédente (facile en remplissant simplement les espaces). Notez que les autres intervenants ont remarqué des effets visuels différents sur leurs plateformes (vous avez vous-même vu \r disparaître sans effet, ce qui est sans précédent dans mon expérience) donc cette belle façon de fournir des mises à jour ne fonctionnera pas bien sur toutes les plateformes! -)

Questions connexes