Come stampare senza newline o spazio?


1872

Mi piacerebbe farlo . Cosa mi piacerebbe fare in questo esempio in:

In C:

#include <stdio.h>

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

Produzione:

..........

In Python:

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

In Python printaggiungerà uno \no uno spazio, come posso evitarlo? Ora, è solo un esempio, non dirmi che posso prima costruire una stringa e poi stamparla. Mi piacerebbe sapere come "aggiungere" le stringhe a stdout.


8
Per coloro che cercano la stringa che formula la documentazione di Python: docs.python.org/library/stdtypes.html#string-formatting
guettli,

1
Sembra che una domanda simile fosse stata posta in precedenza: https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

Risposte:


2535

In Python 3, puoi usare i parametri sep=e end=della printfunzione:

Per non aggiungere una nuova riga alla fine della stringa:

print('.', end='')

Per non aggiungere uno spazio tra tutti gli argomenti della funzione che si desidera stampare:

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

È possibile passare qualsiasi stringa a entrambi i parametri e utilizzare entrambi i parametri contemporaneamente.

In caso di problemi con il buffering, è possibile scaricare l'output aggiungendo l' flush=Trueargomento della parola chiave:

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

Python 2.6 e 2.7

Da Python 2.6 puoi importare la printfunzione da Python 3 usando il __future__modulo :

from __future__ import print_function

che consente di utilizzare la soluzione Python 3 sopra.

Tuttavia, si noti che la flushparola chiave non è disponibile nella versione della printfunzione importata da __future__in Python 2; funziona solo in Python 3, più precisamente 3.3 e versioni successive. Nelle versioni precedenti dovrai comunque scaricare manualmente con una chiamata a sys.stdout.flush(). Dovrai anche riscrivere tutte le altre istruzioni di stampa nel file in cui esegui questa importazione.

Oppure puoi usare sys.stdout.write()

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

Potrebbe anche essere necessario chiamare

sys.stdout.flush()

per assicurarsi che stdoutvenga immediatamente lavato.


2
Grazie! In Python 3.6.3, flush = True è cruciale, altrimenti non funziona come previsto.
Gunit

3
Qualcuno può spiegare perché dovrei flushe cosa fa effettivamente?
Rishav,

5
È in ritardo di alcuni mesi, ma per rispondere a @Rishav flush svuota il buffer e visualizza subito l'output. Senza flush potresti eventualmente stampare il tuo testo esatto, ma solo quando il sistema riesce a elaborare la grafica anziché l'IO. Flush rende immediatamente visibile il testo "svuotando" la cache.
Great Turtle,

297

Dovrebbe essere semplice come descritto a questo link da Guido Van Rossum:

Ri: Come si fa a stampare senza AC / R?

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

È possibile stampare qualcosa ma non è stato automaticamente aggiunto un ritorno a capo?

Sì, aggiungi una virgola dopo l'ultimo argomento da stampare. Ad esempio, questo ciclo stampa i numeri 0..9 su una linea separata da spazi. Nota la "stampa" senza parametri che aggiunge la nuova riga finale:

>>> for i in range(10):
...     print i,
... else:
...     print
...
0 1 2 3 4 5 6 7 8 9
>>> 

99
Questo è specificamente elencato nella domanda come comportamento indesiderato a causa degli spazi
Zags

87
Al contrario, la risposta dovrebbe essere eliminata per due motivi: ha effetti collaterali indesiderati che non è possibile disabilitare (inclusi spazi extra) e non è compatibile con Python 3 (la parentesi forza una conversione in una tupla) . Mi aspetto questo tipo di costrutti scadenti da PHP, non da Python. Quindi è meglio non usarlo mai.
Eric Leschinski,

9
//, Questo è il modo più semplice per farlo in Python 2, comunque, e c'è MOLTO codice una tantum disponibile per sistemi operativi davvero vecchi. Probabilmente non è la soluzione migliore, o addirittura raccomandata. Tuttavia, uno dei grandi vantaggi di StackOverflow è che ci consente di sapere quali sono i trucchi strani disponibili. KDP, includeresti un breve avviso in alto su ciò che ha detto @Eric Leschinski? Ha senso, dopo tutto.
Nathan Basanese,

23
@nathanbasanese Semplice o no, ha un effetto collaterale che chi chiede esplicitamente non vuole . Downvoted.
Shadur,

8
270 voti positivi per una risposta che non risponde specificamente alla domanda. Buon lavoro, gente del voto. Buon lavoro.
Cilindrico

168

Nota: il titolo di questa domanda era in qualche modo simile a "Come stampare in Python?"

Poiché le persone potrebbero venire qui a cercarlo in base al titolo, Python supporta anche la sostituzione in stile 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

Inoltre, puoi moltiplicare facilmente i valori di stringa:

>>> print "." * 10
..........

10
Anzi, manca il punto. :) Dato che c'era già un'ottima risposta alla domanda, stavo solo elaborando alcune tecniche correlate che potrebbero rivelarsi utili.
Beau,

8
Sulla base del titolo della domanda, credo che questa risposta sia un analogo più appropriato al modo in cui si usa comunemente printf in C / C ++
Dan

16
Questo risponde al titolo della domanda, ma non al corpo. Detto questo, mi ha fornito quello che stavo cercando. :)
ayman,

2
non è la risposta alla domanda
Vanuan,

4
@Vanuan, ho spiegato in fondo alla mia risposta che il titolo della domanda è cambiato ad un certo punto. :)
Beau

93

Utilizzare la funzione di stampa in stile python3 per python2.6 + (interromperà anche qualsiasi istruzione di stampa con parole chiave esistente nello stesso file.)

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

Per non rovinare tutte le parole chiave di stampa di python2, creare un printf.pyfile separato

# printf.py

from __future__ import print_function

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

Quindi, usalo nel tuo file

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

Altri esempi che mostrano lo stile printf

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

39

Come stampare sulla stessa linea:

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

27

La nuova funzione (a partire da Python 3.x) printha un endparametro opzionale che ti consente di modificare il carattere finale:

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

Produzione:

CIAO CIAO

C'è anche sepper il separatore:

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

Produzione:

CIAO CIAO CIAO

Se vuoi usarlo in Python 2.x, aggiungi questo all'inizio del tuo file:

from __future__ import print_function


1
cosa fa "sep"?
McPeppr,

1
@McPeppr So che questo è vecchio ma ho comunque modificato la risposta per maggiore chiarezza. Controllalo adesso.
TheTechRobo36414519

Grazie per la modifica. sep tornerà utile. Finora ho usato sep.join (elenco) per concatenare elementi di un elenco con un separatore in mezzo - perfetto per scrivere file csv
McPeppr

21

Utilizzo di functools.partial per creare una nuova funzione chiamata printf

>>> import functools

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

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

Modo semplice per avvolgere una funzione con parametri predefiniti.


16

Puoi semplicemente aggiungere ,la fine della printfunzione in modo che non venga stampata su una nuova riga.


1
//, Questo in realtà lo ha fatto stampare nulla. Non è necessario quindi aggiungere un'altra istruzione di stampa senza un argomento alla fine, come mostrato in stackoverflow.com/a/493500/2146138 ? Saresti disposto a modificare questa risposta con un esempio davvero breve di due o tre righe?
Nathan Basanese,

3
L'OP non vuole aggiungere uno spazio
pepery

2
Non ho risposto alla domanda. No spazi.
shrewmouse,

Questo non funziona più in Python 2.x e risponde solo alla metà di ciò che l'OP voleva. Perché 16 voti positivi?
TheTechRobo36414519

12

In Python 3+, printè una funzione. Quando chiami

print('hello world')

Python lo traduce in

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

Puoi cambiare endquello che vuoi.

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

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('.')

se lo spazio extra è OK dopo ogni stampa, in Python 2

print '.',

fuorviante in Python 2 - evitare :

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') `

8

Puoi provare:

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')

5

Puoi fare lo stesso in python3 come segue:

#!usr/bin/python

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

ed eseguirlo con python filename.pyopython3 filename.py


5

di recente ho avuto lo stesso problema ..

l'ho risolto facendo:

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)

funziona su unix e windows ... non l'ho testato su macosx ...

hth


2
Breakssys.__stdout__
pepery

4

@lenooh ha soddisfatto la mia domanda. Ho scoperto questo articolo mentre cercavo "python soppress newline". Sto usando IDLE3 su Raspberry Pi per sviluppare Python 3.2 per PuTTY. Volevo creare una barra di avanzamento sulla riga di comando di PuTTY. Non volevo che la pagina scorresse via. Volevo una linea orizzontale per rassicurare l'utente dal dare di matto che il programma non si è bloccato e non è stato mandato a pranzo in un gioioso ciclo infinito - come un appello a "lasciarmi stare, sto bene, ma questo potrebbe richiedere del tempo. " messaggio interattivo - come una barra di avanzamento nel testo.

Il print('Skimming for', search_string, '\b! .001', end='')inizializza il messaggio preparando per il prossimo schermo-scrittura, che stamperà tre backspaces come ⌫⌫⌫ rubout e quindi un periodo, rimuovendo '001' ed estendendo la linea di periodi. Dopo search_stringl'input dell'utente da parte dei pappagalli, il \b!punto esclamativo del mio search_stringtesto viene ritagliato sullo spazio che print()altrimenti forza, posizionando correttamente la punteggiatura. Segue uno spazio e il primo "punto" della "barra di avanzamento" che sto simulando. Inutilmente, il messaggio viene quindi innescato con il numero di pagina (formattato con una lunghezza di tre con zeri iniziali) per notare all'utente che i progressi vengono elaborati e che rifletterà anche il conteggio dei periodi che in seguito costruiremo al destra.

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 barra di avanzamento è nel sys.stdout.write('\b\b\b.'+format(page, '03')) linea. Innanzitutto, per cancellare a sinistra, esegue il backup del cursore sui tre caratteri numerici con il rublo "\ b \ b \ b" come ⌫⌫⌫ e rilascia un nuovo punto da aggiungere alla lunghezza della barra di avanzamento. Quindi scrive tre cifre della pagina in cui è progredita finora. Poiché sys.stdout.write()attende la chiusura di un buffer completo o del canale di output, sys.stdout.flush()forza la scrittura immediata. sys.stdout.flush()è incorporato alla fine del print()quale è bypassato print(txt, end='' ). Quindi il codice scorre ciclicamente le sue operazioni quotidiane mentre non stampa più nulla fino a quando non ritorna qui per cancellare tre cifre, aggiungere un punto e scrivere di nuovo tre cifre, incrementato.

Le tre cifre cancellate e riscritte non sono affatto necessarie - è solo un fiorire che esemplifica sys.stdout.write()contro print(). Puoi semplicemente eseguire il priming con un punto e dimenticare i tre fantasi backslash-b ⌫ backspaces (ovviamente non scrivere anche il conteggio delle pagine formattate) semplicemente stampando la barra del periodo più a lungo di una ogni volta - senza spazi o newline usando solo il sys.stdout.write('.'); sys.stdout.flush()paio.

Si noti che la shell Raspberry Pi IDLE3 Python non rispetta il backspace come ⌫ rubout ma stampa invece uno spazio, creando invece un elenco apparente di frazioni.

- (o = 8> wiz


4

Noterai che tutte le risposte sopra riportate sono corrette. Ma volevo creare una scorciatoia per scrivere sempre il parametro "end = ''" alla fine.

È possibile definire una funzione come

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

Accetterebbe tutto il numero di parametri. Anche accetterà tutti gli altri parametri come file, flush, ecc. E con lo stesso nome.


Non funziona, si lamenta che *argè all'inizio (python 2.7) e, alla fine, è stato eseguito, ma non ha funzionato del tutto bene. Ho definito una funzione che ha solo preso Print(*args), e poi ho appena chiamato stampa con sep='', end=''. E ora funziona come voglio. Quindi un voto per l'idea.
Otzen,

4

Molte di queste risposte sembrano un po 'complicate. In Python 3.x fai semplicemente questo:

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

Il valore predefinito di end è "\n". Lo stiamo semplicemente cambiando in uno spazio o puoi anche usare end=""(nessuno spazio) per fare ciò che printfnormalmente fa.


3

vuoi stampare qualcosa per il ciclo giusto, ma non vuoi che venga stampato in una nuova riga ogni volta .. per esempio:

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

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

ma vuoi che stampi così: ciao ciao ciao ciao ciao giusto ???? basta aggiungere una virgola dopo la stampa "ciao"

Esempio:

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


5
No, l'OP vuole hihihihihi, non ciao ciao ciao ciao
Cool Javelin

1

O hanno una funzione come:

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

Quindi ora:

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

Uscite:

0123456789

0
for i in xrange(0,10): print '\b.',

Funzionava sia in 2.7.8 che in 2.5.2 (Canopy e terminali OSX, rispettivamente) - nessuna importazione di modulo o viaggio nel tempo richiesto.


8
Che stampa i caratteri di backspace sullo standard output. Potrebbe sembrare corretto se l'output standard sembra essere un terminale, ma se viene reindirizzato a un file quel file conterrà caratteri di controllo.
Keith Thompson,

1
È vero, ma non riesco a immaginare che qualcuno vorrebbe usarlo per qualcosa di diverso da una barra di avanzamento a bassa tecnologia ...
tyersome

1
Tuttavia, il codice Python non fa la stessa cosa del codice C nella domanda.
Keith Thompson,

puoi provare con sys.stdout.isatty()se non reindirizzato a un file.
fcm

0

Esistono due modi generali per farlo:

Stampa senza newline in Python 3.x

Non aggiungere nulla dopo l'istruzione print e rimuovere '\ n' usando end='' come:

>>> 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 altro esempio in Loop :

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

Stampa senza newline in Python 2.x

L'aggiunta di una virgola finale indica che dopo la stampa ignora \n.

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

Un altro esempio in Loop :

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

Spero che questo ti possa aiutare. Puoi visitare questo link .


E lo spazio?
shrewmouse,

usare end=" "ad esempio: print ('hello', end = '' "); print ('world')
susan097

La soluzione 2.7 non rimuove lo spazio.
shrewmouse,

Dico che rimuovere '\ n' non spazio, lo spazio è di default in python2. Guarda come appare: print 'hello' ;print'there'in paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097

Bene, ecco perché la tua risposta è stata votata in negativo. Non hai risposto alla domanda "Come stampare senza newline o spazio?". La tua risposta per 2.x non risponde alla domanda. La tua risposta per 3.0 è la stessa di molte delle altre risposte pubblicate più di nove anni fa. Detto semplicemente, questa risposta non aggiunge nulla di utile alla comunità e dovresti eliminarla.
shrewmouse,

-3

... non è necessario importare alcuna libreria. Basta usare il carattere di eliminazione:

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

questo rimuove la newline e lo spazio (^ _ ^) *

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.