Comment imprimer sans nouvelle ligne ni espace?

1873

J'aimerais le faire en . Ce que je voudrais faire dans cet exemple dans:

En C:

#include <stdio.h>

int main() {
    int i;
    for (i=0; i<10; i++) printf(".");
    return 0;
}

Production:

..........

En Python:

>>> for i in range(10): print('.')
.
.
.
.
.
.
.
.
.
.
>>> print('.', '.', '.', '.', '.', '.', '.', '.', '.', '.')
. . . . . . . . . .

En Python printva ajouter un \nou un espace, comment puis-je éviter cela? Maintenant, c'est juste un exemple, ne me dites pas que je peux d'abord construire une chaîne puis l'imprimer. Je voudrais savoir comment "ajouter" des chaînes à stdout.

Andrea Ambu
la source
8
Pour ceux qui recherchent la documentation de formatage de chaîne de python: docs.python.org/library/stdtypes.html#string-formatting
guettli
1
On dirait qu'une question similaire avait été posée précédemment: https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

Réponses:

2535

En Python 3, vous pouvez utiliser les paramètres sep=et end=de la printfonction:

Pour ne pas ajouter de nouvelle ligne à la fin de la chaîne:

print('.', end='')

Pour ne pas ajouter d'espace entre tous les arguments de fonction que vous souhaitez imprimer:

print('a', 'b', 'c', sep='')

Vous pouvez transmettre n'importe quelle chaîne à l'un des paramètres et utiliser les deux paramètres en même temps.

Si vous rencontrez des problèmes avec la mise en mémoire tampon, vous pouvez vider la sortie en ajoutant un flush=Trueargument de mot clé:

print('.', end='', flush=True)

Python 2.6 et 2.7

Depuis Python 2.6, vous pouvez soit importer la printfonction depuis Python 3 en utilisant le __future__module :

from __future__ import print_function

ce qui vous permet d'utiliser la solution Python 3 ci-dessus.

Cependant, notez que le flushmot-clé n'est pas disponible dans la version de la printfonction importée de __future__Python 2; cela ne fonctionne que dans Python 3, plus spécifiquement 3.3 et versions ultérieures. Dans les versions antérieures, vous devrez toujours vider manuellement avec un appel à sys.stdout.flush(). Vous devrez également réécrire toutes les autres instructions d'impression dans le fichier où vous effectuez cette importation.

Ou vous pouvez utiliser sys.stdout.write()

import sys
sys.stdout.write('.')

Vous devrez peut-être également appeler

sys.stdout.flush()

pour s'assurer stdoutest rincé immédiatement.

codelogic
la source
2
Merci! En Python 3.6.3, ce flush = True est crucial, sinon il ne fonctionne pas comme prévu.
gunit
3
Quelqu'un peut-il expliquer pourquoi en aurais-je besoin flushet que fait-il réellement?
Rishav
5
Il est en retard de quelques mois, mais pour répondre, la vidange @Rishav vide le tampon et affiche la sortie maintenant. Sans vidage, votre texte exact pourrait éventuellement être imprimé, mais uniquement lorsque le système se mettra à traiter les graphiques au lieu de l'IO. Vider rend le texte immédiatement visible en «vidant» le cache.
Great Turtle
297

Cela devrait être aussi simple que décrit sur ce lien par Guido Van Rossum:

Re: Comment imprimer sans ac / r?

http://legacy.python.org/search/hypermail/python-1992/0115.html

Est-il possible d'imprimer quelque chose sans y avoir automatiquement un retour chariot?

Oui, ajoutez une virgule après le dernier argument à imprimer. Par exemple, cette boucle imprime les nombres 0..9 sur une ligne séparée par des espaces. Notez le "print" sans paramètre qui ajoute la nouvelle ligne finale:

>>> for i in range(10):
...     print i,
... else:
...     print
...
0 1 2 3 4 5 6 7 8 9
>>> 
KDP
la source
99
Ceci est spécifiquement répertorié dans la question comme comportement indésirable en raison des espaces
Zags
87
Au contraire, la réponse doit être supprimée pour deux raisons: elle a des effets secondaires indésirables que vous ne pouvez pas désactiver (espaces supplémentaires inclus), et elle n'est pas compatible avec Python 3 (la parenthèse force une conversion en tuple) . Je m'attends à ce genre de constructions de mauvaise qualité de PHP, pas de Python. Il est donc préférable de ne jamais l'utiliser.
Eric Leschinski
9
//, C'est le moyen le plus simple de le faire en Python 2, et il y a BEAUCOUP de code unique pour les systèmes d'exploitation très anciens. Probablement pas la meilleure solution, ni même recommandée. Cependant, l'un des grands avantages de StackOverflow est qu'il nous permet de savoir quels trucs bizarres existent. KDP, incluriez-vous un avertissement rapide en haut de ce qu'a dit @Eric Leschinski? Cela a du sens, après tout.
Nathan Basanese
23
@nathanbasanese Simple ou pas, il a un effet secondaire que le demandeur ne veut pas explicitement . Voté.
Shadur
8
270 votes positifs pour une réponse qui spécifiquement ne répond pas à la question. Bon travail en votant. Bon travail.
Cylindrique
168

Remarque: Le titre de cette question était quelque chose comme "Comment imprimer en python?"

Étant donné que les gens peuvent venir ici à la recherche en fonction du titre, Python prend également en charge la substitution de style printf:

>>> strings = [ "one", "two", "three" ]
>>>
>>> for i in xrange(3):
...     print "Item %d: %s" % (i, strings[i])
...
Item 0: one
Item 1: two
Item 2: three

Et, vous pouvez facilement multiplier les valeurs de chaîne:

>>> print "." * 10
..........
Beau
la source
10
En effet, il manque le point. :) Puisqu'il y avait déjà une excellente réponse à la question, je me contentais d'élaborer sur certaines techniques connexes qui pourraient s'avérer utiles.
Beau
8
Sur la base du titre de la question, je pense que cette réponse est plus appropriée à la façon dont on utilise couramment printf en C / C ++
Dan
16
Cela répond au titre de la question, mais pas au corps. Cela dit, cela m'a fourni ce que je cherchais. :)
ayman
2
ce n'est pas la réponse à la question
Vanuan
4
@Vanuan, j'ai expliqué au bas de ma réponse que le titre de la question avait changé à un moment donné. :)
Beau
93

Utilisez la fonction d'impression de style python3 pour python2.6 + (cassera également toutes les instructions d'impression existantes par mot-clé dans le même fichier.)

# for python2 to use the print() function, removing the print keyword
from __future__ import print_function
for x in xrange(10):
    print('.', end='')

Pour ne pas ruiner tous vos mots clés d'impression python2, créez un printf.pyfichier séparé

# printf.py

from __future__ import print_function

def printf(str, *args):
    print(str % args, end='')

Ensuite, utilisez-le dans votre fichier

from printf import printf
for x in xrange(10):
    printf('.')
print 'done'
#..........done

Plus d'exemples montrant le style printf

printf('hello %s', 'world')
printf('%i %f', 10, 3.14)
#hello world10 3.140000
k107
la source
39

Comment imprimer sur la même ligne:

import sys
for i in xrange(0,10):
   sys.stdout.write(".")
   sys.stdout.flush()
lenooh
la source
27

La nouvelle fonction (à partir de Python 3.x) printa un endparamètre facultatif qui vous permet de modifier le caractère de fin:

print("HELLO", end="")
print("HELLO")

Production:

BONJOUR BONJOUR

Il y a aussi seppour le séparateur:

print("HELLO", "HELLO", "HELLO", sep="")

Production:

BONJOUR BONJOUR BONJOUR

Si vous vouliez l'utiliser dans Python 2.x, ajoutez-le simplement au début de votre fichier:

from __future__ import print_function

SilentGhost
la source
1
que fait "sep"?
McPeppr
1
@McPeppr Je sais que c'est vieux mais j'ai quand même édité la réponse pour plus de clarté. Vérifie-le maintenant.
TheTechRobo36414519
Merci pour l'édition. sep sera utile. Jusqu'à présent, j'ai utilisé sep.join (list) pour concaténer des éléments d'une liste avec un séparateur entre les deux - parfait pour écrire des fichiers csv
McPeppr
21

Utilisation de functools.partial pour créer une nouvelle fonction appelée printf

>>> import functools

>>> printf = functools.partial(print, end="")

>>> printf("Hello world\n")
Hello world

Un moyen facile d'envelopper une fonction avec des paramètres par défaut.

sohail288
la source
16

Vous pouvez simplement ajouter ,à la fin de la printfonction pour qu'elle ne s'imprime pas sur la nouvelle ligne.

user3763437
la source
1
//, Cela ne faisait en fait rien imprimer. N'avons-nous pas besoin d'ajouter ensuite une autre instruction d'impression sans argument à la fin, comme indiqué dans stackoverflow.com/a/493500/2146138 ? Seriez-vous prêt à modifier cette réponse avec un exemple vraiment court de deux ou trois lignes?
Nathan Basanese
3
L'OP ne veut pas d'espace ajouté
pppery
2
N'a pas répondu à la question. Sans espaces.
musaraigne
Cela ne fonctionne plus dans Python 2.x et ne répond qu'à la moitié de ce que l'OP voulait. Pourquoi 16 votes positifs?
TheTechRobo36414519
12

En Python 3+, printest une fonction. Quand vous appelez

print('hello world')

Python le traduit en

print('hello world', end='\n')

Vous pouvez changer endce que vous voulez.

print('hello world', end='')
print('hello world', end=' ')
Yaelle
la source
8

python 2.6+ :

from __future__ import print_function # needs to be first statement in file
print('.', end='')

python 3 :

print('.', end='')

python <= 2,5 :

import sys
sys.stdout.write('.')

si l'espace supplémentaire est OK après chaque impression, en python 2

print '.',

trompeur en python 2 - éviter :

print('.'), # avoid this if you want to remain sane
# this makes it look like print is a function but it is not
# this is the `,` creating a tuple and the parentheses enclose an expression
# to see the problem, try:
print('.', 'x'), # this will print `('.', 'x') `
n611x007
la source
8

Tu peux essayer:

import sys
import time
# Keeps the initial message in buffer.
sys.stdout.write("\rfoobar bar black sheep")
sys.stdout.flush()
# Wait 2 seconds
time.sleep(2)
# Replace the message with a new one.
sys.stdout.write("\r"+'hahahahaaa             ')
sys.stdout.flush()
# Finalize the new message by printing a return carriage.
sys.stdout.write('\n')
alvas
la source
5

Vous pouvez faire la même chose en python3 comme suit:

#!usr/bin/python

i = 0
while i<10 :
    print('.',end='')
    i = i+1

et l'exécuter avec python filename.pyoupython3 filename.py

Subbu
la source
5

j'ai récemment eu le même problème ..

je l'ai résolu en faisant:

import sys, os

# reopen stdout with "newline=None".
# in this mode,
# input:  accepts any newline character, outputs as '\n'
# output: '\n' converts to os.linesep

sys.stdout = os.fdopen(sys.stdout.fileno(), "w", newline=None)

for i in range(1,10):
        print(i)

cela fonctionne à la fois sur unix et sur windows ... je ne l'ai pas testé sur macosx ...

hth

ssgam
la source
2
Pausessys.__stdout__
pppery
4

@lenooh a satisfait ma requête. J'ai découvert cet article en recherchant «python suppress newline». J'utilise IDLE3 sur Raspberry Pi pour développer Python 3.2 pour PuTTY. Je voulais créer une barre de progression sur la ligne de commande PuTTY. Je ne voulais pas que la page défile. Je voulais une ligne horizontale pour rassurer l'utilisateur de ne pas paniquer que le programme ne s'est pas interrompu ni envoyé pour déjeuner sur une joyeuse boucle infinie - comme un appel à `` me laisser être, je vais bien, mais cela peut prendre un certain temps. message interactif - comme une barre de progression dans le texte.

L' print('Skimming for', search_string, '\b! .001', end='')initialise le message en préparant la prochaine sérigraphie, qui imprimera trois espaces arrière comme ⌫⌫⌫ effacement puis une période, en effaçant '001' et en étendant la ligne des périodes. Après search_stringla saisie par l'utilisateur des perroquets, le \b!coupe le point d'exclamation de mon search_stringtexte pour reculer sur l'espace qui print()autrement force, en plaçant correctement la ponctuation. Cela est suivi d'un espace et du premier «point» de la «barre de progression» que je simule. Inutilement, le message est également amorcé avec le numéro de page (formaté à une longueur de trois avec des zéros en tête) pour prendre note de l'utilisateur que la progression est en cours de traitement et qui reflétera également le nombre de périodes que nous développerons plus tard dans le droite.

import sys

page=1
search_string=input('Search for?',)
print('Skimming for', search_string, '\b! .001', end='')
sys.stdout.flush() # the print function with an end='' won't print unless forced
while page:
    # some stuff…
    # search, scrub, and build bulk output list[], count items,
    # set done flag True
    page=page+1 #done flag set in 'some_stuff'
    sys.stdout.write('\b\b\b.'+format(page, '03')) #<-- here's the progress bar meat
    sys.stdout.flush()
    if done: #( flag alternative to break, exit or quit)
        print('\nSorting', item_count, 'items')
        page=0 # exits the 'while page' loop
list.sort()
for item_count in range(0, items)
    print(list[item_count])
#print footers here
 if not (len(list)==items):
    print('#error_handler')

La viande de la barre de progression est en sys.stdout.write('\b\b\b.'+format(page, '03'))ligne. Tout d'abord, pour effacer vers la gauche, il sauvegarde le curseur sur les trois caractères numériques avec le "\ b \ b \ b" comme ⌫⌫⌫ rubout et supprime une nouvelle période à ajouter à la longueur de la barre de progression. Il écrit ensuite trois chiffres de la page vers laquelle il a progressé jusqu'à présent. Parce sys.stdout.write()qu'attend la fermeture d'un tampon complet ou du canal de sortie, sys.stdout.flush()force l'écriture immédiate. sys.stdout.flush()est construit à la fin de print()laquelle est contourné avecprint(txt, end='' ) . Ensuite, le code parcourt ses opérations quotidiennes intensives tout en n'imprimant rien de plus jusqu'à ce qu'il revienne ici pour effacer trois chiffres, ajouter un point et écrire à nouveau trois chiffres, incrémentés.

Les trois chiffres effacés et réécrits ne sont en aucun cas nécessaires - c'est juste un épanouissement qui illustre sys.stdout.write()contre print(). Vous pouvez tout aussi facilement amorcer avec un point et oublier les trois espaces arrière de barre oblique inversée fantaisie (bien sûr, n'écrivant pas également le nombre de pages formatées) en imprimant simplement la barre de période plus longtemps une par une - sans espaces ni nouvelles lignes en utilisant uniquement lesys.stdout.write('.'); sys.stdout.flush() paire.

Veuillez noter que le shell Raspberry Pi IDLE3 Python n'honore pas le retour arrière comme ⌫ rubout mais imprime à la place un espace, créant à la place une liste apparente de fractions.

- (o = 8> wiz

DisneyWizard
la source
4

Vous remarquerez que toutes les réponses ci-dessus sont correctes. Mais je voulais créer un raccourci pour toujours écrire le paramètre "end = ''" à la fin.

Vous pouvez définir une fonction comme

def Print(*args,sep='',end='',file=None,flush=False):
    print(*args,sep=sep,end=end,file=file,flush=flush)

Il accepterait tout le nombre de paramètres. Même il acceptera tous les autres paramètres comme file, flush, etc. et avec le même nom.

Bikram Kumar
la source
Il ne s'exécute pas, il se plaint qu'il *argest au début (python 2.7), et le mettre à la fin s'est exécuté, mais n'a pas fonctionné correctement. J'ai défini une fonction qui ne prenait que Print(*args), puis que j'appelais print avec sep='', end=''. Et maintenant ça marche comme je veux. Donc, un vote positif pour l'idée.
Otzen
4

Beaucoup de ces réponses semblent un peu compliquées. Dans Python 3.x, vous faites simplement ceci:

print(<expr>, <expr>, ..., <expr>, end=" ")

La valeur par défaut de end est "\n". Nous le changeons simplement en espace ou vous pouvez également utiliser end=""(pas d'espace) pour faire ce qui printfse fait normalement.

jarr
la source
3

vous voulez imprimer quelque chose dans la boucle droite, mais vous ne voulez pas l'imprimer dans une nouvelle ligne à chaque fois .. par exemple:

 for i in range (0,5):
   print "hi"

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

mais vous voulez qu'il s'imprime comme ceci: hi hi hi hi hi hi right ???? il suffit d'ajouter une virgule après l'impression "salut"

Exemple:

for i in range (0,5): print "hi", OUTPUT: hi hi hi hi hi

Bala.K
la source
5
Non, l'OP veut hihihihihi, pas hi hi hi hi hi
Cool Javelin
1

Ou avoir une fonction comme:

def Print(s):
   return sys.stdout.write(str(s))

Alors maintenant:

for i in range(10): # or `xrange` for python 2 version
   Print(i)

Les sorties:

0123456789
U10-Forward
la source
0
for i in xrange(0,10): print '\b.',

Cela a fonctionné dans les deux 2.7.8 et 2.5.2 (Canopy et terminal OSX, respectivement) - aucune importation de module ou voyage dans le temps requis.

tyersome
la source
8
Cela imprime les caractères de retour arrière sur la sortie standard. Il peut sembler correct si la sortie standard se trouve être un terminal, mais s'il est redirigé vers un fichier, ce fichier contiendra des caractères de contrôle.
Keith Thompson
1
C'est vrai, mais je ne peux pas imaginer que quelqu'un voudrait l'utiliser pour autre chose qu'une barre de progression low-tech ...
tyersome
1
Néanmoins, le code Python ne fait pas la même chose que le code C dans la question.
Keith Thompson
vous pouvez tester avec sys.stdout.isatty()sinon redirigé vers un fichier.
fcm
0

Il existe deux manières générales de procéder:

Imprimer sans nouvelle ligne dans Python 3.x

N'ajoutez rien après l'instruction print et supprimez '\ n' en utilisant end='' comme:

>>> print('hello')
hello  # appending '\n' automatically
>>> print('world')
world # with previous '\n' world comes down

# solution is:
>>> print('hello', end='');print(' world'); # end with anything like end='-' or end=" " but not '\n'
hello world # it seem correct output

Un autre exemple en boucle :

for i in range(1,10):
    print(i, end='.')

Imprimer sans nouvelle ligne dans Python 2.x

L'ajout d'une virgule de fin indique qu'après l'impression, ignorez \n.

>>> print "hello",; print" world"
hello world

Un autre exemple en boucle :

for i in range(1,10):
    print "{} .".format(i),

J'espère que cela vous aidera. Vous pouvez visiter ce lien .

susan097
la source
Et l'espace?
shrewmouse
utiliser end=" "par exemple: print ('hello', end = '' "); print ('world')
susan097
Votre solution 2.7 ne supprime pas l'espace.
shrewmouse
Je mentionne que supprimer '\ n' pas d'espace, l'espace est par défaut en python2. Voir à quoi cela ressemble: print 'hello' ;print'there'dans paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097
C'est pourquoi votre réponse a été rejetée. Vous n'avez pas répondu à la question "Comment imprimer sans nouvelle ligne ni espace?". Votre réponse pour 2.x ne répond pas à la question. Votre réponse pour 3.0 est la même que pour la plupart des autres réponses publiées il y a plus de neuf ans. En termes simples, cette réponse n'ajoute rien d'utile à la communauté et vous devez la supprimer.
musaraigne
-3

... vous n'avez pas besoin d'importer de bibliothèque. Utilisez simplement le caractère de suppression:

BS=u'\0008' # the unicode for "delete" character
for i in range(10):print(BS+"."),

cela supprime la nouvelle ligne et l'espace (^ _ ^) *

mchrgr2000
la source