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.