web-dev-qa-db-fra.com

Python Espacement et alignement des chaînes

J'essaie d'ajouter un espacement pour aligner le texte entre deux chaînes de caractères sans utiliser "" pour le faire

Essayer d'obtenir le texte qui ressemble à ceci, avec la deuxième colonne alignée.

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

Actuellement, le code est comme ça, en utilisant simplement des espaces ...

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

J'ai essayé de travailler avec string.rjust & srting.ljust mais en vain.

Suggestions?

42
Tristan Forward

Vous devriez pouvoir utiliser la méthode de formatage:

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

Vous devrez déterminer la longueur du format pour chaque ligne en fonction de la longueur de l'étiquette. La ligne Utilisateur aura besoin d’une largeur de format plus large que celle des lignes Location ou District.

59
IronMensan

Essayez %*s et %-*s et préfixez chaque chaîne par la largeur de la colonne:

>>> 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
40
Charles Beattie

Vous pouvez utiliser expandtabs pour spécifier le tabstop, comme ceci:

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

La réponse de la méthode de formatage @ IronMensan est la voie à suivre. Mais dans l’intérêt de répondre à votre question à propos de 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

Modifier pour noter que cette méthode ne vous oblige pas à savoir combien de temps vos chaînes sont. .format () peut aussi, mais je ne le connais pas assez pour le 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'
10
JoeFish

Ressusciter un autre sujet, mais cela peut être utile pour certains.

En vous inspirant un peu de https://pyformat.info , vous pouvez créer une méthode pour obtenir une impression de style Table of Content [TOC].

# Define parameters
Location = '10-10-10-10'
Revision = 1
District = 'Tower'
MyDate = 'May 16, 2012'
MyUser = 'LOD'
MyTime = '10:15'

# This is just one way to arrange the data
data = [
    ['Location: '+Location, 'Revision:'+str(Revision)],
    ['District: '+District, 'Date: '+MyDate],
    ['User: '+MyUser,'Time: '+MyTime]
]

# The 'Table of Content' [TOC] style print function
def print_table_line(key,val,space_char,val_loc):
    # key:        This would be the TOC item equivalent
    # val:        This would be the TOC page number equivalent
    # space_char: This is the spacing character between key and val (often a dot for a TOC), must be >= 5
    # val_loc:    This is the location in the string where the first character of val would be located

    val_loc = max(5,val_loc)

    if (val_loc <= len(key)):
        # if val_loc is within the space of key, truncate key and
        cut_str =  '{:.'+str(val_loc-4)+'}'
        key = cut_str.format(key)+'...'+space_char

    space_str = '{:'+space_char+'>'+str(val_loc-len(key)+len(str(val)))+'}'
    print(key+space_str.format(str(val)))

# Examples
for d in data:
    print_table_line(d[0],d[1],' ',30)

print('\n')
for d in data:
    print_table_line(d[0],d[1],'_',25)

print('\n')
for d in data:
    print_table_line(d[0],d[1],' ',20)

Le résultat obtenu est le suivant:

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


Location: 10-10-10-10____Revision:1
District: Tower__________Date: May 16, 2012
User: LOD________________Time: 10:15


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