¿Cómo puedo completar una cadena de Python con espacios?

509

Quiero completar una cadena con espacios. Sé que lo siguiente funciona para ceros:

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

Pero, ¿qué debo hacer cuando quiero esto ?:

'hi    '

por supuesto que puedo medir la longitud de la cuerda y hacer str+" "*leftover, pero me gustaría el camino más corto

cirio
fuente
1
Sé que podría ser obsoleto en el futuro, pero todavía me gusta este buen método: "%-6s" % salineado a la izquierda y alineado "%6s" % sa la derecha.
Basj

Respuestas:

700

Puedes hacer esto con str.ljust(width[, fillchar]):

Devuelve la cadena justificada a la izquierda en una cadena de largo ancho . El relleno se realiza utilizando el fillchar especificado (el valor predeterminado es un espacio). La cadena original se devuelve si el ancho es menor que len(s).

>>> 'hi'.ljust(10)
'hi        '
Felix Kling
fuente
18
La respuesta de @simon es más flexible y más útil al formatear cadenas más complejas
CoatedMoose
3
o @abbot si estás atascado en el soporte de versiones antiguas de python
CoatedMoose
1
ljust () ahora está en desuso. Consulte stackoverflow.com/questions/14776788/… para ver la forma correcta de hacerlo
Mawg dice que reinstale a Mónica el
¿Se ha ido en Python 3? Solo quería agregar que también hay justo y centro que funcionan de la misma manera pero para diferentes alineaciones
Radtek
17
ljust (), rjust () han quedado en desuso solo del módulo de cadena. Están disponibles en el tipo incorporado str.
Rohan Grover
374

Para un método flexible que funciona incluso cuando formatea cadenas complicadas, probablemente debería usar el mini-lenguaje de formateo de cadenas , ya sea usando el str.format()método

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

de cuerdas f

>>> f'{"Hi": <16} StackOverflow!'  # Python >= 3.6
'Hi               StackOverflow!'
Simón
fuente
11
¿Qué pasa si tienes '16' en una variable?
Randy
Me di cuenta de eso también. Debería haberlo publicado. Los documentos dicen que esto debería funcionar para Py2.6, pero mis hallazgos son de otra manera. Sin embargo, funciona en Py2.7.
Randy
1
Tuve problemas con este tipo de formato cuando estaba usando acentos nacionales. Desearía que 'kra' y 'krá' fueran lo mismo, pero no lo fueron.
quapka
77
@Randy'{message: <{fill}}'.format(message='Hi', fill='16')
CivFan
19
No lo use str.format()para plantillas con solo una {...}y nada más. Sólo tiene que utilizar la format()función y ahorrarse el análisis de gastos generales: format('Hi', '<16').
Martijn Pieters
119

El nuevo método de formato de cadena (ish) le permite hacer algunas cosas divertidas con argumentos de palabras clave anidadas. El caso más simple:

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

Si desea pasar 16como una variable:

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

Si desea pasar variables para todo el kit y kaboodle :

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

Lo que resulta en (lo has adivinado):

'Hi              '
CivFan
fuente
¿Cómo manejarías variar el mensaje también? msgs = ['hola', 'hola', 'ciao']
ak_slick
1
@ak_slick Puede pasar variables en lugar de valores codificados a la función de formato.
CivFan
80

Puedes probar esto:

print "'%-100s'" % 'hi'
abad
fuente
imprimir "'% -6s'"% 'hola' de hecho !!
cono
8
@simon como alguien atrapado en un sistema python2.5 esta respuesta me ayudó, no una respuesta inútil +1
sunshinekitty
18
Ya no está en desuso en 3.3+
Seppo Erviälä
3
Me gusta esta sintaxis común de printf mucho mejor. Le permite escribir cadenas complejas sin innumerables concatenaciones.
Max Tsepkov
44
Para completar, "'%+100s'" % 'hi'funcionaría para poner espacios a la derecha de'hi'
Eric Blum
63

La forma correcta de hacerlo sería utilizar la sintaxis de formato de Python como se describe en la documentación oficial

Para este caso, simplemente sería:
'{:10}'.format('hi')
qué salidas:
'hi '

Explicación:

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" | "%"

Casi todo lo que necesitas saber está ahí ^.

Actualización: a partir de python 3.6, ¡es aún más conveniente con interpolación de cadenas literales!

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

Uso str.ljust():

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

También debe considerar string.zfill(), str.ljust()y str.center()para el formato de cadena. Estos se pueden encadenar y tener el carácter ' relleno ' especificado, por lo tanto:

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

Estas operaciones de formateo de cadenas tienen la ventaja de trabajar en Python v2 y v3.

Echa un vistazo a pydoc stralguna vez: hay una gran cantidad de cosas buenas allí.

Johnsyweb
fuente
27

A partir de Python 3.6 solo puedes hacer

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

con interpolación literal de cadenas .

O, si el tamaño de su relleno está en una variable, como esta (¡gracias @Matt M.!):

>>> to_pad = 10
>>> f'{strng: <{to_pad}}'
WAF
fuente
44
f'{strng: >10}'para llenar una cuerda con espacios en blanco iniciales hasta una longitud de 10. Eso es mágico. Y no está bien documentado.
Chang Ye
@changye Creo que este también es el comportamiento predeterminado de f'{strng:10}'.
WAF
17

También puedes centrar tu cadena:

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

Utilice el mini formato de Python 2.7 para cadenas :

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

Esto se alinea a la izquierda y se ajusta a 8 caracteres con el carácter ''.

aodj
fuente
44
@simon ya dio esta respuesta ... ¿por qué publicar una respuesta duplicada?
Felix Kling
55
No hice clic en "se han publicado nuevas respuestas, haga clic para actualizar" y me lo perdí.
aodj
5

Simplemente elimine el 0 y agregará espacio en su lugar:

>>> print  "'%6d'"%4
Amir Mofakhar
fuente
2

¿No sería más pitónico usar rebanado?

Por ejemplo, para rellenar una cadena con espacios a la derecha hasta que tenga 10 caracteres de longitud:

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

Para rellenarlo con espacios a la izquierda hasta que tenga 15 caracteres de longitud:

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

Requiere saber cuánto tiempo desea rellenar, por supuesto, pero no requiere medir la longitud de la cadena con la que está comenzando.

Zev Chonoles
fuente
99
No, no lo haría.
Físico loco
1
Puedes profundizar sobre eso? No es que no te crea, solo quiero entender por qué.
Zev Chonoles
44
Por supuesto. La forma más pitónica sería utilizar una de las funciones integradas en lugar de utilizar una solución local tanto como sea posible.
Físico loco
@MadPhysicist dice que cortar es menos pitónico porque debes usarlo en funciones integradas, es como decir que ''.join(reversed(str))es más pitónico que str[::-1], y todos sabemos que eso no es cierto.
Nick
@NickA. Esa no es una muy buena analogía. El caso que está utilizando como ejemplo es bastante válido. Sin embargo, (x + " " * 10)[:10]en mi opinión , es mucho más complicado que usarlo x.ljust(10).
Físico loco
0

Un buen truco para usar en lugar de los diversos formatos de impresión:

(1) Almohadilla con espacios a la derecha:

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

(2) Almohadilla con ceros a la izquierda:

('0000' + str(2))[-4:]
Erik Anderson
fuente
1
Por alguna razón, esta es la respuesta más divertida, pero me gusta. En ese sentido también considere: min_len = 8entonces ('hi' + ' '*min_len)[:min_len]o('0'*min_len + str(2))[-min_len]
Poikilos
1
Para el número, sería ('0'*min_len + str(2))[-min_len:]más bien, aunque esto es solo por diversión, y recomiendo las otras respuestas.
Poikilos
-1

Podrías hacerlo usando la comprensión de la lista, esto también te daría una idea sobre el número de espacios y sería una respuesta.

"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello                 '
foobar666
fuente
... y luego obtienes una cadena que tiene 22 (len ("hola") + 17 :() caracteres largos - eso no salió bien. Mientras estamos siendo graciosos podríamos hacerlo s = "hi"; en s + (6-len(s)) * " "cambio (está bien cuando el resultado es negativo). Sin embargo, las respuestas que usan cualquier característica del marco que aborde el problema exacto serán más fáciles de mantener (ver otras respuestas).
Poikilos