Come posso compilare una stringa Python con spazi?


509

Voglio compilare una stringa con spazi. So che il seguente funziona per zero:

>>> print  "'%06d'"%4
'000004'

Ma cosa dovrei fare quando lo voglio ?:

'hi    '

ovviamente posso misurare la lunghezza della corda e farlo str+" "*leftover, ma mi piacerebbe il modo più breve.


1
So che potrebbe essere deprecato in futuro, ma mi piace ancora questo buon vecchio metodo: "%-6s" % sper allineato a sinistra e "%6s" % sper allineato a destra.
Basj,

Risposte:


700

Puoi farlo con str.ljust(width[, fillchar]):

Restituisce la stringa lasciata giustificata in una stringa di lunghezza larghezza . Il riempimento viene eseguito utilizzando il fillchar specificato (il valore predefinito è uno spazio). La stringa originale viene restituita se la larghezza è inferiore a len(s).

>>> 'hi'.ljust(10)
'hi        '

18
La risposta di @simon è più flessibile e più utile quando si formattano stringhe più complesse
CoatedMoose

3
o @abbot se sei bloccato a supportare vecchie versioni di Python
CoatedMoose

1
ljust () è ora deprecato. Vedi stackoverflow.com/questions/14776788/… per il modo corretto di farlo
Mawg dice di ripristinare Monica

È andato in Python 3? Volevo solo aggiungere che c'è anche rjust e center che funzionano più o meno allo stesso modo ma per diversi allineamenti
radtek,

17
ljust (), rjust () sono stati deprecati solo dal modulo stringa. Sono disponibili nel tipo incorporato str.
Rohan Grover,

374

Per un metodo flessibile che funziona anche durante la formattazione di stringhe complicate, probabilmente dovresti usare il mini-linguaggio di formattazione delle stringhe , usando entrambi i str.format()metodi

>>> '{0: <16} StackOverflow!'.format('Hi')  # Python >=2.6
'Hi               StackOverflow!'

di f-stringhe

>>> f'{"Hi": <16} StackOverflow!'  # Python >= 3.6
'Hi               StackOverflow!'

11
E se avessi '16' in una variabile?
Randy,

L'ho capito anch'io. Dovrebbe averlo pubblicato. I documenti dicono che dovrebbe funzionare per Py2.6, ma i miei risultati sono diversi. Funziona in Py2.7 però.
Randy,

1
Ho avuto problemi con questo tipo di formattazione quando stavo usando gli accenti nazionali. Vorresti che 'kra' e 'krá' fossero gli stessi, ma non lo erano.
quapka,

77
@Randy'{message: <{fill}}'.format(message='Hi', fill='16')
CivFan,

19
Non utilizzare str.format()per i modelli con un solo {...}e nient'altro. Basta usare la format()funzione di e risparmiare il parsing in testa: format('Hi', '<16').
Martijn Pieters

119

Il nuovo metodo di formato stringa (ish) ti consente di fare cose divertenti con argomenti di parole chiave nidificate. Il caso più semplice:

>>> '{message: <16}'.format(message='Hi')
'Hi             '

Se vuoi passare 16come variabile:

>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi              '

Se vuoi passare le variabili per l' intero kit e kaboodle :

'{message:{fill}{align}{width}}'.format(
   message='Hi',
   fill=' ',
   align='<',
   width=16,
)

Il risultato è (hai indovinato):

'Hi              '

Come gestiresti anche variando il messaggio? msgs = ['ciao', 'ciao', 'ciao']
ak_slick

1
@ak_slick È possibile passare variabili al posto di valori hardcoded nella funzione format.
CivFan,

80

Puoi provare questo:

print "'%-100s'" % 'hi'

stampa "'% -6s'"% 'ciao' davvero !!
cono

8
@simon come qualcuno bloccato su un sistema python2.5 questa risposta mi ha aiutato, non una risposta inutile +1
sunshinekitty

18
Non più deprecato in 3.3+
Seppo Erviälä,

3
Mi piace molto meglio questa sintassi comune di printf. Ti permette di scrivere stringhe complesse senza innumerevoli concatenazioni.
Max Tsepkov,

4
Per completezza, "'%+100s'" % 'hi'avrebbe funzionato per mettere gli spazi a destra di'hi'
Eric Blum

63

Il modo corretto di fare questo sarebbe usare la sintassi del formato di Python come descritto nella documentazione ufficiale

In questo caso sarebbe semplicemente:
'{:10}'.format('hi')
quali output:
'hi '

Spiegazione:

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

Praticamente tutto ciò che devi sapere è lì ^.

Aggiornamento: a partire da Python 3.6 è ancora più conveniente con l'interpolazione letterale delle stringhe!

foo = 'foobar'
print(f'{foo:10} is great!')
# foobar     is great!

37

Utilizzare str.ljust():

>>> 'Hi'.ljust(6)
'Hi    '

Dovresti anche considerare string.zfill(), str.ljust()e str.center()per la formattazione delle stringhe. Questi possono essere concatenati e avere il carattere ' riempimento ' specificato, quindi:

>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
'        00000003   blindmice....        '

Queste operazioni di formattazione delle stringhe hanno il vantaggio di lavorare in Python v2 e v3.

Dai un'occhiata a pydoc strqualche volta: c'è un sacco di cose buone lì dentro.


27

A partire da Python 3.6 puoi semplicemente farlo

>>> strng = 'hi'
>>> f'{strng: <10}'

con interpolazione letterale di stringhe .

Oppure, se la dimensione della tua imbottitura è in una variabile, in questo modo (grazie @Matt M.!):

>>> to_pad = 10
>>> f'{strng: <{to_pad}}'

4
f'{strng: >10}'per riempire la stringa con spazi bianchi iniziali per una lunghezza di 10. Questa è magia. E non è ben documentato.
Chang Ye,

@changye Credo che questo sia anche il comportamento predefinito di f'{strng:10}'.
WAF,

17

puoi anche centrare la tua stringa:

'{0: ^20}'.format('nice')

7

Usa la mini formattazione di Python 2.7 per le stringhe :

'{0: <8}'.format('123')

Questa sinistra si allinea e passa a 8 caratteri con il carattere "".


4
@simon ha già dato questa risposta ... perché pubblicare una risposta duplicata?
Felix Kling,

5
Non ho fatto clic su "Sono state pubblicate nuove risposte, fai clic per aggiornare" e quindi ho perso.
aodj,


2

Non sarebbe più pitonico usare lo slicing?

Ad esempio, per riempire una stringa con spazi a destra fino a quando è lunga 10 caratteri:

>>> x = "string"    
>>> (x + " " * 10)[:10]   
'string    '

Per riempirlo con spazi a sinistra fino a quando è lungo 15 caratteri:

>>> (" " * 15 + x)[-15:]
'         string'

Richiede ovviamente sapere per quanto tempo desideri effettuare il pad, ma non richiede la misurazione della lunghezza della stringa con cui inizi.


9
No non lo farebbe.
Fisico pazzo,

1
Puoi approfondire questo? Non è che non ti credo, voglio solo capire il perché.
Zev Chonoles,

4
Sicuro. Il modo più pitonico sarebbe usare una delle funzioni integrate invece di utilizzare il più possibile una soluzione fatta in casa.
Fisico pazzo,

@MadPhysicist dire che lo slicing è meno pitonico perché dovresti usare le funzioni integrate è come dire che ''.join(reversed(str))è più pitonico di str[::-1], e sappiamo tutti che non è vero.
Nick,

@NickA. Questa non è un'ottima analogia. Il caso che stai usando come esempio è abbastanza valido. Tuttavia, (x + " " * 10)[:10]secondo me è molto più contorto rispetto all'uso x.ljust(10).
Fisico pazzo,

0

Un bel trucco da usare al posto dei vari formati di stampa:

(1) Pad con spazi a destra:

('hi' + '        ')[:8]

(2) Pad con zeri iniziali a sinistra:

('0000' + str(2))[-4:]

1
Per qualche ragione questa è la risposta più divertente ma mi piace. In tal senso anche considerare: min_len = 8poi ('hi' + ' '*min_len)[:min_len]o('0'*min_len + str(2))[-min_len]
Poikilos

1
Per il numero, sarebbe ('0'*min_len + str(2))[-min_len:]piuttosto, anche se questo è solo per divertimento, e raccomando le altre risposte.
Poikilos,

-1

Potresti farlo usando la comprensione dell'elenco, questo ti darebbe anche un'idea del numero di spazi e sarebbe una linea.

"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello                 '

... e poi ottieni una stringa di 22 (len ("ciao") + 17 :() di caratteri lunghi - che non è andata bene. Mentre siamo divertenti potremmo fare s = "hi"; s + (6-len(s)) * " "invece (va bene quando il risultato è negativo.) Tuttavia, le risposte che utilizzano qualsiasi funzionalità del framework che risolve il problema esatto saranno più facili da mantenere (vedi altre risposte).
Poikilos
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.