Je voudrais faire plusieurs déclarations qui donnent une sortie standard sans voir de nouvelles lignes entre les déclarations.
Plus précisément, supposons que j'ai:
for item in range(1,100):
print item
Le résultat est:
1
2
3
4
.
.
.
Comment obtenir ceci à la place:
1 2 3 4 5 ...
Encore mieux, est-il possible d'imprimer le numéro unique sur le dernier numéro, donc un seul numéro est à l'écran à la fois?
Réponses:
Changer
print item
pour:print item,
en Python 2.7print(item, end=" ")
en Python 3Si vous souhaitez imprimer les données dynamiquement, utilisez la syntaxe suivante:
print(item, sep=' ', end='', flush=True)
en Python 3la source
'\n'
caractère est écrit à la fin, sauf si l'print
instruction se termine par une virgule. Il s'agit de la seule action si l'instruction contient uniquement le mot cléprint
.flush
ne fonctionne pas avecfrom __future__ import print_function
malheureusement.print(item, end=", ")
ajoute,
ensuite au dernier élément comment faire pour l'empêcher d'ajouter,
au dernier élémentEn général, la façon de le faire est d'utiliser des codes de contrôle de terminal . Il s'agit d'un cas particulièrement simple, pour lequel vous n'avez besoin que d'un caractère spécial: U + 000D CARRIAGE RETURN, qui est écrit
'\r'
en Python (et dans de nombreux autres langages). Voici un exemple complet basé sur votre code:Certaines choses à ce sujet peuvent être surprenantes:
\r
va au début de la chaîne de sorte que, pendant l'exécution du programme, le curseur sera toujours après le numéro. Ce n'est pas seulement cosmétique: certains émulateurs de terminaux sont très confus si vous le faites dans l'autre sens.stdout.flush
est nécessaire sur certains systèmes, ou vous n'obtiendrez aucune sortie. D'autres systèmes peuvent ne pas l'exiger, mais cela ne fait aucun mal.Si vous trouvez que cela ne fonctionne pas, la première chose que vous devez soupçonner est que votre émulateur de terminal est bogué. Le programme vttest peut vous aider à le tester.
Vous pouvez remplacer le
stdout.write
par uneprint
déclaration mais je préfère ne pas mélangerprint
avec l'utilisation directe des objets fichier.la source
flush()
force un fichier à envoyer tout ce qu'il a au système d'exploitation en ce moment. Je suis surpris que cela fonctionne pour vous sans cela - cela n'a pas fonctionné pour moi jusqu'à ce que je l'ajoute.ncurses
pour le faire.sys.stdout.flush()
semble être mendatory sur monFreebsd
avecPython 2.7
Utilisez
print item,
pour que l'instruction print omet la nouvelle ligne.En Python 3, c'est
print(item, end=" ")
.Si vous voulez que chaque nombre s'affiche au même endroit, utilisez par exemple (Python 2.7):
En Python 3, c'est un peu plus compliqué; ici, vous devez vider
sys.stdout
ou il n'imprimera rien avant la fin de la boucle:la source
Comme les autres exemples,
j'utilise une approche similaire, mais au lieu de passer du temps à calculer la dernière longueur de sortie, etc.,
J'utilise simplement les échappements de code ANSI pour revenir au début de la ligne, puis effacer cette ligne entière avant d'imprimer ma sortie d'état actuelle.
Pour l'utiliser dans votre boucle d'itération, vous appelleriez simplement quelque chose comme:
Voir plus ici
la source
Vous pouvez ajouter une virgule de fin à votre instruction d'impression pour imprimer un espace au lieu d'une nouvelle ligne à chaque itération:
Alternativement, si vous utilisez Python 2.6 ou version ultérieure, vous pouvez utiliser la nouvelle fonction d'impression, qui vous permettrait de spécifier que même pas d'espace ne devrait venir à la fin de chaque élément en cours d'impression (ou vous permet de spécifier quelle extrémité vous vouloir):
Enfin, vous pouvez écrire directement sur la sortie standard en l'important à partir du module sys, qui renvoie un objet de type fichier:
la source
changement
à
la source
\033[K
code? J'aimerais en savoir plus à leur sujet.print
rince déjà en interne. Pas besoin de l'appeler.print
est différent de l'sys.stdout.write()
endroit où vous devez vider l'écranJe pense qu'une simple jointure devrait fonctionner:
la source
print ' '.join(str(x) for x in range(1, 10))
.Une autre réponse que j'utilise sur 2.7 où j'imprime juste un "." chaque fois qu'une boucle s'exécute (pour indiquer à l'utilisateur que les choses fonctionnent toujours) est la suivante:
Il imprime le "." caractères sans espaces entre chacun. Il a l'air un peu mieux et fonctionne plutôt bien. Le \ b est un caractère de retour arrière pour ceux qui se demandent.
la source
Tant de réponses compliquées. Si vous avez python 3, mettez simplement
\r
au début de l'impression, et ajoutez-end='', flush=True
y:Cela écrira
0 foo bar
, puis1 foo bar
etc, sur place.la source
print('\r' + filename + " ", end = '', flush=True)
Pour que les nombres s’écrasent, vous pouvez faire quelque chose comme ceci:
Cela devrait fonctionner tant que le numéro est imprimé dans la première colonne.
EDIT: Voici une version qui fonctionnera même si elle n'est pas imprimée dans la première colonne.
Je dois noter que ce code a été testé et fonctionne très bien en Python 2.5 sur Windows, dans la console WIndows. Selon certains autres, un rinçage de la sortie standard peut être nécessaire pour voir les résultats. YMMV.
la source
"Au fait ... Comment le rafraîchir à chaque fois pour qu'il s'imprime en un seul endroit, il suffit de changer le numéro."
C'est un sujet vraiment délicat. Quel zack suggéré (produire des codes de contrôle de console) est un moyen d'y parvenir.
Vous pouvez utiliser (n) curses, mais cela fonctionne principalement sur * nixes.
Sur Windows (et voici une partie intéressante) qui est rarement mentionné (je ne comprends pas pourquoi), vous pouvez utiliser des liaisons Python vers WinAPI ( http://sourceforge.net/projects/pywin32/ également avec ActivePython par défaut) - ce n'est pas que dur et fonctionne bien. Voici un petit exemple:
Ou, si vous souhaitez utiliser
print
(instruction ou fonction, aucune différence):win32console
Le module vous permet de faire beaucoup plus de choses intéressantes avec la console Windows ... Je ne suis pas un grand fan de WinAPI, mais récemment j'ai réalisé qu'au moins la moitié de mon antipathie à son égard était causée par l'écriture de code WinAPI en C - les liaisons pythoniques sont beaucoup plus facile à utiliser.Toutes les autres réponses sont excellentes et pythoniques, bien sûr, mais ... Et si je voulais imprimer sur la ligne précédente ? Ou écrire du texte multiligne, puis l'effacer et réécrire les mêmes lignes? Ma solution rend cela possible.
la source
pour Python 2.7
pour Python 3
la source
la source
Si vous souhaitez simplement imprimer les chiffres, vous pouvez éviter la boucle.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100 a pris 21.1986929975ms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100 a pris 491.466823551ms
la source
map
.La meilleure façon d'y parvenir est d'utiliser le
\r
personnageEssayez simplement le code ci-dessous:
la source
En Python 3, vous pouvez le faire de cette façon:
Les sorties:
Tuple: Vous pouvez faire la même chose avec un tuple:
Les sorties:
Un autre exemple:
Les sorties:
Vous pouvez même déballer votre tuple comme ceci:
Les sorties:
une autre variante:
Les sorties:
la source
Une virgule à la fin de l'instruction print omet la nouvelle ligne.
mais cela ne remplace pas.
la source
Pour ceux qui ont du mal comme moi, j'ai trouvé ce qui suit qui semble fonctionner à la fois en python 3.7.4 et 3.5.2.
J'ai étendu la plage de 100 à 1 000 000 car il fonctionne très rapidement et vous ne pouvez pas voir la sortie. En effet, l'un des effets secondaires du paramètre
end='\r'
est que l'itération de boucle finale efface toute la sortie. Un nombre plus long était nécessaire pour démontrer que cela fonctionne. Ce résultat n'est peut-être pas souhaitable dans tous les cas, mais était bien dans le mien, et OP n'a pas spécifié d'une manière ou d'une autre. Vous pouvez potentiellement contourner cela avec une instruction if qui évalue la longueur du tableau en cours d'itération, etc. La clé pour le faire fonctionner dans mon cas était de coupler les crochets"{}"
avec.format()
. Sinon, cela n'a pas fonctionné.Ci-dessous devrait fonctionner tel quel:
la source
Sortie: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
la source
Ou encore plus simple:
end="\r"
remplacera depuis le début [0:] de la première impression.la source