web-dev-qa-db-fra.com

Impression avec indentation en python

est-il possible d'imprimer ce qui suit,

print user + ":\t\t" + message

de sorte que les longs messages qui sont plus larges que la longueur du terminal s'enroulent toujours (commence à la même position)? donc par exemple cela

Username:              LEFTLEFTLEFTLEFTLEFTLEFTLEFT
RIGHTRIGHTRIGHT

devraient devenir

Username:              LEFTLEFTLEFTLEFTLEFTLEFTLEFT
                       RIGHTRIGHTRIGHT
19
Algorithmatic

Je pense que ce que vous cherchez ici est le module textwrap :

user = "Username"
prefix = user + ": "
preferredWidth = 70
wrapper = textwrap.TextWrapper(initial_indent=prefix, width=preferredWidth,
                               subsequent_indent=' '*len(prefix))
message = "LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT " * 3
print wrapper.fill(message)

Cela imprime:

Username: LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT
          LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT
          LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT

Si vous voulez réellement utiliser des tabulations dans le retrait, c'est un peu plus compliqué, car vous devez d'abord développer les tabulations par initial_indent pour trouver le bon subsequent_indent utiliser. Et, parce que votre préfixe se termine se termine avec deux onglets, c'est encore plus compliqué. Voici le plus simple que j'ai trouvé:

user = "Username"
prefix = user + ":\t\t"
expanded_indent = textwrap.fill(prefix+'$', replace_whitespace=False)[:-1]
subsequent_indent = ' ' * len(expanded_indent)
wrapper = textwrap.TextWrapper(initial_indent=prefix,
                               subsequent_indent=subsequent_indent)
message = "LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT " * 3
print wrapper.fill(message)

Si vous faites cela à plusieurs reprises, vous voudrez probablement envelopper ce gâchis dans une fonction.

24
abarnert

Vous pouvez utiliser str.ljust() pour remplir chaque ligne à la largeur requise comme suit:

line_width = 20
print "Username:".ljust(line_width) + "LEFT"*6
print "".ljust(line_width) + "RIGHT"*3

L'argument que vous passez à ljust est la longueur que vous souhaitez que la chaîne soit, tant que cela est cohérent, les lignes doivent s'aligner correctement.

Alternativement, vous pouvez utiliser la multiplication de chaînes sur les lignes où vous avez juste besoin du remplissage comme ceci:

print " "*line_width + "RIGHT"*3

Cela aura exactement la même sortie que la dernière ligne du code ci-dessus.

6
user764357

Je suggère d'utiliser format pour mettre en retrait à gauche, par exemple:

print 'Username: {:>40}'.format('Foo')
print '          {:>40}'.format('FooBar')

Se traduira par:

Username:                                      Foo
                                            FooBar

Aussi,

print '{:<30}{:<40}'.format('UserName:','Foo')
print '{:<30}{:<40}'.format('User:','FooBar')
print '{:<30}{:<40}'.format('','FooBar42')

résultera en:

UserName:                     Foo                                     
User:                         FooBar                                  
                              FooBar42     

Etc...

2
ntg