2012-10-02 16 views
45

Solo quiero columnas de texto de ancho fijo pero las cadenas están todas acolchadas a la derecha, en lugar de izquierda !!¿Cómo alinear izquierda una cadena de ancho fijo?

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 
+0

shweet! gracias ... tenía que ser bastante simple. umm ahora con 3 respuestas correctas simultáneas ¿quién recibe el tic verde? –

Respuesta

89

Usted puede prefijar el requisito de tamaño con - a la izquierda justificar:

sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry)) 
+0

Buena solución. Esta es la mejor solución. – SuB

24
sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry)) 

en un lado nota que puede hacer que la variable de ancho con *-s

>>> d = "%-*s%-*s"%(25,"apple",30,"something") 
>>> d 
'apple     something      ' 
9

Uso -50% en lugar de +50% Ellos estarán alineados a la izquierda ..

+0

ex: 'print"% -30s "% (name)' para imprimir el nombre con sangría izquierda. – mrsrinivas

36

Esta versión utiliza el método str.format.

Python 2.7 y más reciente versión

sys.stdout.write("{:<7}{:<51}{:<25}\n".format(code, name, industry)) 

Python 2,6

sys.stdout.write("{0:<7}{1:<51}{2:<25}\n".format(code, name, industry)) 

ACTUALIZACIÓN

Anteriormente no se está eliminando una declaración en la documentación sobre el operador% del lenguaje en el futuro. Esta declaración ha sido removed from the docs.

+5

El estilo anterior ya no se va a desaprobar, creo que: http://bugs.python.org/issue14123 –

+0

Parece que ese problema se ha rechazado. Etapa: cometido/rechazado –

+0

Ese estado también se usa para indicar "comprometido", que definitivamente fue porque los cambios se realizaron en la documentación. Lo que era "Old String Formatting Operations" en los 3.2 documentos ahora es [printf-style String Formatting] (http://docs.python.org/py3k/library/stdtypes.html#printf-style-string-formatting) en 3.3 . La posible advertencia de desaprobación, que en realidad decía "quizás se vaya", nunca fue definitiva, ahora también está ausente de esa sección, reemplazada por una advertencia de que es "peculiar". No va a desaparecer. –

2

Una solución alternativa un poco más legible:
sys.stdout.write(code.ljust(5)+name.ljust(20)+industry)

Nota que ljust(#ofchars) utiliza caracteres de ancho fijo y no se ajusta dinámicamente como las otras soluciones.

4

Éste trabajó en mi script en Python:

print "\t%-5s %-10s %-10s %-10s %-10s %-10s %-20s" % (thread[0],thread[1],thread[2],thread[3],thread[4],thread[5],thread[6]) 
+0

No estoy seguro de lo que esto agrega en términos de diferenciación de cualquier otra cosa. y qué diablos es la matriz de hilos? – UpAndAdam

0

definitivamente prefiero el método format más, ya que es muy flexible y se puede extender fácilmente a sus clases personalizadas mediante la definición de __format__ o los str o repr representaciones . Por el simple hecho de mantenerlo simple, estoy usando print en los siguientes ejemplos, que pueden ser reemplazados por sys.stdout.write.

ejemplos sencillos: 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 añadir junto a los align especifica que son ^, < y > un carácter de relleno para reemplazar el espacio por cualquier otro carácter

print("{0:.^10}".format("Guido")) #..Guido... 

ejemplos Multiinput: de alineación, y llenar muchas entradas

print("{0:.<20} {1:.>20} {2:.^20} ".format("Product", "Price", "Sum")) 
#'Product............. ...............Price ........Sum.........' 

Ejemplos Avanzados

Si usted tiene sus clases personalizadas, se puede definir que es str o repr representaciones de la siguiente :

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 establece de manera predeterminada en __format__, que también se puede sobrescribir. x = foo()

print "{0!r:<10}".format(x) #'...::12::..' 
print "{0!s:<10}".format(x) #'...::4::..' 

Fuente: Python Essential Reference, David M. Beazley, 4ª Edición

Cuestiones relacionadas