2012-05-16 9 views
35

Estoy intentando agregar espaciado para alinear el texto en medio de dos cadenas vars sin usar "" para hacerloespaciado y la alineación de las cadenas de Python

Tratando de conseguir el texto se vea como este, con la segunda columna que se está alineado.

Location: 10-10-10-10  Revision: 1 
District: Tower    Date: May 16, 2012 
User: LOD     Time: 10:15 

Actualmente se han codificado como este, simplemente usando espacios ...

"Location: " + Location + "    Revision: " + Revision + '\n' 

he intentado trabajar con string.rjust & srting.ljust pero fue en vano.

Sugerencias?

+3

string.ljust debería hacer lo que desee. ¿Puedes publicar lo que probaste en la arena .ljust? – JoeFish

+1

Siempre puede usar '" \ t "' –

+0

Vea también http://stackoverflow.com/questions/1448820/variable-length-of-s-with-the-operator-in-python#1448834 –

Respuesta

50

Usted debe ser capaz de utilizar el método de formato:

"Location: {0:20} Revision {1}".format(Location,Revision) 

Tendrá que averiguar la longitud del formato para cada línea dependiendo de la longitud de la etiqueta. La línea de usuario necesitará un ancho de formato más ancho que las líneas de Ubicación o Distrito.

+7

Vea http://docs.python.org/library/string.html#formatspec para ayudar con el funcionamiento del comando de formato. –

30

Trate %*s y %-*s y el prefijo de cada cadena con el ancho de la columna:

>>> print "Location: %-*s Revision: %s" % (20,"10-10-10-10","1") 
Location: 10-10-10-10   Revision: 1 
>>> print "District: %-*s Date: %s" % (20,"Tower","May 16, 2012") 
District: Tower     Date: May 16, 2012 
+2

Desearía poder darte más votos positivos. Solución ordenada, no sabía sobre el operador "*" en el formateo de cuerdas –

+0

Esto es MUY cercano a lo que estoy tratando de hacer. Lo único que queda es que si el Distrito cambia a "DOE", las columnas aún estarían en el mismo lugar que antes. ¿Hay alguna forma de establecer siempre cierta distancia, digamos 20 caracteres, antes de alinear la columna que sea independiente de la longitud del valor en la primera columna? –

+0

Sí, simplemente trátalo como en otra columna: '"% -9s% -20s% -9s% -20s "% (" Ubicación: "," 10-10-10-10 "," Revisión: "," 1 ") ' –

18

Usted puede utilizar expandtabs para especificar el tabstop, así:

>>> print ('Location:'+'10-10-10-10'+'\t'+ 'Revision: 1').expandtabs(30) 
>>> print ('District: Tower'+'\t'+ 'Date: May 16, 2012').expandtabs(30) 
#Output: 
Location:10-10-10-10   Revision: 1 
District: Tower    Date: May 16, 2012 
9

@ respuesta método de formato de IronMensan es el camino a seguir. Sin embargo, en aras de responder a su pregunta sobre ljust:

>>> def printit(): 
...  print 'Location: 10-10-10-10'.ljust(40) + 'Revision: 1' 
...  print 'District: Tower'.ljust(40) + 'Date: May 16, 2012' 
...  print 'User: LOD'.ljust(40) + 'Time: 10:15' 
... 
>>> printit() 
Location: 10-10-10-10     Revision: 1 
District: Tower       Date: May 16, 2012 
User: LOD        Time: 10:15 

Editar tener en cuenta que este método no requiere que saber cuánto tiempo sus cadenas son. .format() también puede, pero no estoy lo suficientemente familiar como para decirlo.

>>> uname='LOD' 
>>> 'User: {}'.format(uname).ljust(40) + 'Time: 10:15' 
'User: LOD        Time: 10:15' 
>>> uname='Tiddlywinks' 
>>> 'User: {}'.format(uname).ljust(40) + 'Time: 10:15' 
'User: Tiddlywinks      Time: 10:15' 
Cuestiones relacionadas