2012-05-16 17 views
35

che sto cercando di aggiungere la spaziatura per allineare il testo tra due stringhe vars senza utilizzare "" per fare in modoPython spaziatura e l'allineamento stringhe

Cercando di ottenere il testo a guardare come questo, con la seconda colonna di essere allineata.

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

momento disponiamo è codificato in questo modo, usando solo gli spazi ...

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

Ho provato a lavorare con string.rjust & srting.ljust ma senza alcun risultato.

Suggerimenti?

+3

string.ljust dovrebbe fare quello che vuoi. Puoi pubblicare ciò che hai provato nell'arena .ljust? – JoeFish

+1

Puoi sempre usare '" \ t "' –

+0

Vedi anche http://stackoverflow.com/questions/1448820/variable-length-of-s-with-the-operator-in-python#1448834 –

risposta

50

Si dovrebbe essere in grado di utilizzare il metodo format:

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

Si dovrà capire la lunghezza del formato per ciascuna linea a seconda della lunghezza dell'etichetta. La riga User avrà bisogno di una larghezza di formato più ampia rispetto alle linee Location o District.

+7

Vedi http://docs.python.org/library/string.html#formatspec per aiutare con il funzionamento del comando di formattazione. –

30

Prova %*s e %-*s e prefisso ogni stringa con la larghezza della colonna:

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

Vorrei poterti dare più voti. Soluzione pulita, non conoscevo l'operatore "*" nella stringa formando –

+0

Questo è MOLTO vicino a quello che sto cercando di fare. L'unica cosa rimasta sarebbe che se il Distretto dovesse cambiare "DOE", le colonne sarebbero ancora nella stessa posizione di prima. C'è modo di impostare sempre una certa distanza per dire 20 caratteri prima che la colonna sia allineata che è indipendente dalla lunghezza del valore nella prima colonna? –

+0

Sì, trattalo come un'altra colonna: '"% -9s% -20s% -9s% -20s "% (" Posizione: "," 10-10-10-10 "," Revisione: "," 1 ") ' –

18

È possibile utilizzare expandtabs per specificare il tabstop, in questo modo:

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

@ metodo format risposta di IronMensan è la ben fatto. Ma nell'interesse di rispondere le tue domande su 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 

Modifica per notare che questo metodo non richiede di sapere per quanto tempo le corde sono. .format() può anche, ma non ho abbastanza familiarità con esso da dire.

>>> 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'