recortar - funcion format en python
¿Cómo alinear una cadena de ancho fijo? (7)
Definitivamente prefiero el método de format
, ya que es muy flexible y se puede extender fácilmente a sus clases personalizadas definiendo __format__
o las representaciones str
o repr
. En aras de mantenerlo simple, estoy usando print
en los siguientes ejemplos, que pueden ser reemplazados por sys.stdout.write
.
Ejemplos simples: alineación / llenado
#Justify / ALign (left, mid, right)
print("{0:<10}".format("Guido")) # ''Guido ''
print("{0:>10}".format("Guido")) # '' Guido''
print("{0:^10}".format("Guido")) # '' Guido ''
Podemos agregar al lado de la align
especifica que son ^
, <
y >
un personaje de relleno para reemplazar el espacio por cualquier otro personaje
print("{0:.^10}".format("Guido")) #..Guido...
Ejemplos de entrada múltiple: alinee y complete muchas entradas
print("{0:.<20} {1:.>20} {2:.^20} ".format("Product", "Price", "Sum"))
#''Product............. ...............Price ........Sum.........''
Ejemplos avanzados
Si tiene sus clases personalizadas, puede definir sus representaciones str
o repr
siguiente manera:
class foo(object):
def __str__(self):
return "...::4::.."
def __repr__(self):
return "...::12::.."
Ahora puede usar !s
(str) o !r
(repr) para decirle a python que llame a esos métodos definidos. Si no se define nada, Python se predetermina a __format__
que también se puede sobrescribir. x = foo ()
print "{0!r:<10}".format(x) #''...::12::..''
print "{0!s:<10}".format(x) #''...::4::..''
Fuente: Referencia esencial de Python, David M. Beazley, 4ta edición
Solo quiero columnas de texto de ancho fijo, pero las cadenas están todas acolchadas a la derecha, en vez de izquierda !!
sys.stdout.write("%6s %50s %25s/n" % (code, name, industry))
produce
BGA BEGA CHEESE LIMITED Food Beverage & Tobacco
BHP BHP BILLITON LIMITED Materials
BGL BIGAIR GROUP LIMITED Telecommunication Services
BGG BLACKGOLD INTERNATIONAL HOLDINGS LIMITED Energy
pero queremos
BGA BEGA CHEESE LIMITED Food Beverage & Tobacco
BHP BHP BILLITON LIMITED Materials
BGL BIGAIR GROUP LIMITED Telecommunication Services
BGG BLACKGOLD INTERNATIONAL HOLDINGS LIMITED Energy
Esta versión usa el método str.format .
Python 2.7 y versiones posteriores
sys.stdout.write("{:<7}{:<51}{:<25}/n".format(code, name, industry))
Versión Python 2.6
sys.stdout.write("{0:<7}{1:<51}{2:<25}/n".format(code, name, industry))
ACTUALIZAR
Anteriormente, había una declaración en los documentos acerca de que el operador% se eliminaría del idioma en el futuro. Esta declaración ha sido eliminada de los documentos .
Este trabajó en mi script python:
print "/t%-5s %-10s %-10s %-10s %-10s %-10s %-20s" % (thread[0],thread[1],thread[2],thread[3],thread[4],thread[5],thread[6])
Puede prefijar el requisito de tamaño con -
justificar a la izquierda:
sys.stdout.write("%-6s %-50s %-25s/n" % (code, name, industry))
Una solución alternativa ligeramente más legible:
sys.stdout.write(code.ljust(5) + name.ljust(20) + industry)
Tenga en cuenta que ljust(#ofchars)
usa caracteres de ancho fijo y no se ajusta dinámicamente como las otras soluciones.
Use -50%
vez de +50%
Se alinearán a la izquierda.
sys.stdout.write("%-6s %-50s %-25s/n" % (code, name, industry))
en una nota lateral puede hacer que el ancho sea variable con *-s
>>> d = "%-*s%-*s"%(25,"apple",30,"something")
>>> d
''apple something ''