Como posso preencher uma string Python com espaços?


509

Eu quero preencher uma string com espaços. Eu sei que o seguinte funciona para zero:

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

Mas o que devo fazer quando quiser isso ?:

'hi    '

é claro que posso medir o comprimento da corda e fazer str+" "*leftover, mas gostaria da maneira mais curta.


1
Sei que pode ser preterido no futuro, mas ainda gosto desse bom e velho método: "%-6s" % spara alinhado à esquerda e alinhado "%6s" % sà direita.
Basj

Respostas:


700

Você pode fazer isso com str.ljust(width[, fillchar]):

Retorne a string justificada à esquerda em uma string de comprimento width . O preenchimento é feito usando o preenchimento especificado (o padrão é um espaço). A cadeia original será retornada se a largura for menor que len(s).

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

18
resposta @simon 's é mais flexível e mais útil ao formatar cordas mais complexas
CoatedMoose

3
ou @abbot é se você está preso apoiar versões antigas do python
CoatedMoose

1
ljust () agora está obsoleto. Consulte stackoverflow.com/questions/14776788/… para obter a maneira correta de fazê-lo
Mawg diz que restabelece Monica em

Foi em python 3? Só queria acrescentar que há também rjust e centro que o trabalho da mesma maneira, mas para diferentes alinhamentos
radtek

17
ljust (), rjust () foram descontinuados apenas do módulo de strings. Eles estão disponíveis no tipo embutido str.
Rohan Grover

374

Para um método flexível que funcione mesmo ao formatar uma sequência complicada, você provavelmente deve usar o mini-idioma de formatação de sequência , usando o str.format()método

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

de cordas f

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

11
E se você tiver '16' em uma variável?
Randy

Eu também descobri isso. Deveria ter postado. Os documentos dizem que isso deve funcionar para o Py2.6, mas minhas conclusões são outras. Funciona em Py2.7 embora.
Randy

1
Eu tive problemas com esse tipo de formatação quando estava usando sotaques nacionais. Você gostaria que 'kra' e 'krá' fossem iguais, mas eles não eram.
quapka

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

19
Não use str.format()para modelos com apenas um {...}e mais nada. Basta usar a format()função e salvar-se a análise de sobrecarga: format('Hi', '<16').
Martijn Pieters

119

O novo método de formato de string (ish) permite que você faça coisas divertidas com argumentos de palavras-chave aninhados. O caso mais simples:

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

Se você deseja passar 16como uma variável:

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

Se você deseja passar variáveis ​​para todo o kit e o kaboodle :

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

O que resulta em (você adivinhou):

'Hi              '

Como você lidaria com a variação da mensagem também? msgs = ['oi', 'olá', 'ciao']
ak_slick 03/04

1
@ak_slick Você pode passar variáveis ​​em vez de valores codificados para a função format.
CivFan 03/04

80

Você pode tentar isso:

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

print "'% -6s'"% 'oi' de fato !!
cone

8
@simon como alguém preso em um sistema python2.5 esta resposta me ajudou, não uma resposta inútil +1
sunshinekitty

18
Não é mais reprovado em 3.3+
Seppo Erviälä 16/02

3
Eu gosto muito mais desta sintaxe printf comum. Permite escrever sequências complexas sem inúmeras concatenações.
Max Tsepkov

4
Para completar, "'%+100s'" % 'hi'iria trabalhar para colocar espaços à direita'hi'
Eric Blum

63

A maneira correta de fazer isso seria usar a sintaxe de formato do Python, conforme descrito na documentação oficial

Para este caso, seria simplesmente:
'{:10}'.format('hi')
what outputs:
'hi '

Explicação:

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 tudo que você precisa saber está lá ^.

Atualização: a partir do python 3.6, é ainda mais conveniente com a interpolação literal de strings!

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

37

Use str.ljust():

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

Você também deve considerar string.zfill(), str.ljust()e str.center()para formatação string. Eles podem ser encadeados e ter o caractere ' fill ' especificado, assim:

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

Essas operações de formatação de string têm a vantagem de trabalhar no Python v2 e v3.

Dê uma olhada em pydoc stralgum momento: há muitas coisas boas por aí.


27

No Python 3.6, você pode simplesmente fazer

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

com interpolação de string literal .

Ou, se o tamanho do seu preenchimento estiver em uma variável, desta forma (obrigado @Matt M.!):

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

4
f'{strng: >10}'para preenchimento de string com espaços em branco à esquerda até 10. Isso é mágico. E não está bem documentado.
Chang Ye

@ Changye Eu acredito que este também é o comportamento padrão de f'{strng:10}'.
WAF

17

você também pode centralizar sua string:

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

7

Use a mini formatação do Python 2.7 para strings :

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

Esta esquerda alinha e acumula até 8 caracteres com o caractere ''.


4
@simon já deu esta resposta ... por que postar uma resposta duplicada?
Felix Kling

5
Não cliquei em 'novas respostas foram postadas, clique em para atualizar' e perdi.
aodj


2

Não seria mais pitônico usar a fatia?

Por exemplo, para preencher uma string com espaços à direita até 10 caracteres:

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

Para preenchê-lo com espaços à esquerda até os 15 caracteres:

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

É necessário saber por quanto tempo você deseja preencher, é claro, mas não requer medir o comprimento da string com a qual você está começando.


9
Não, não seria.
Mad Físico

1
Você pode elaborar sobre isso? Não é que eu não acredite em você, eu só quero entender o porquê.
Zev Chonoles

4
Certo. A maneira mais pitônica seria usar uma das funções internas em vez de usar uma solução doméstica o máximo possível.
Físico louco

@ MadPhysicist dizer que fatiar é menos pitônico porque você deve usar em funções construídas é como dizer que ''.join(reversed(str))é mais pitônico que str[::-1], e todos sabemos que isso não é verdade.
1576 Nick

@NickA. Essa não é uma analogia muito boa. O caso que você está usando como exemplo é bastante válido. No entanto, (x + " " * 10)[:10]na minha opinião , é muito mais complicado do que usar x.ljust(10).
Físico Louco

0

Um bom truque para usar no lugar dos vários formatos de impressão:

(1) Almofada com espaços à direita:

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

(2) Almofada com zeros à esquerda:

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

1
Por alguma razão, esta é a resposta mais engraçada, mas eu gosto. Nesse sentido, considere também: min_len = 8então ('hi' + ' '*min_len)[:min_len]ou('0'*min_len + str(2))[-min_len]
Poikilos 25/01

1
Para o número, seria ('0'*min_len + str(2))[-min_len:]melhor, embora isso seja apenas por diversão, e eu recomendo as outras respostas.
Poikilos 28/02

-1

Você poderia fazê-lo usando a compreensão da lista, isso também daria uma idéia sobre o número de espaços e seria uma linha.

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

... e então você obtém uma string com 22 caracteres (len ("olá") + 17 :()) - isso não correu bem. Enquanto estamos sendo engraçados, poderíamos fazer s = "hi"; em s + (6-len(s)) * " "vez disso (tudo bem quando o resultado é negativo) No entanto, respostas que usem qualquer recurso da estrutura que resolva o problema exato serão mais fáceis de manter (consulte outras respostas).
Poikilos
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.