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.