Comment puis-je remplir une chaîne Python avec des espaces?

509

Je veux remplir une chaîne avec des espaces. Je sais que ce qui suit fonctionne pour les zéro:

>>> print  "'%06d'"%4
'000004'

Mais que dois-je faire quand je veux ça?:

'hi    '

bien sûr, je peux mesurer la longueur des cordes et le faire str+" "*leftover, mais j'aimerais le plus court chemin.

effiler
la source
1
Je sais qu'elle pourrait être obsolète à l'avenir, mais j'aime toujours cette bonne vieille méthode: "%-6s" % spour aligné à gauche et "%6s" % spour aligné à droite.
Basj

Réponses:

700

Vous pouvez le faire avec str.ljust(width[, fillchar]):

Renvoie la chaîne justifiée à gauche dans une chaîne de longueur largeur . Le remplissage est effectué à l'aide du fillchar spécifié (la valeur par défaut est un espace). La chaîne d'origine est renvoyée si la largeur est inférieure à len(s).

>>> 'hi'.ljust(10)
'hi        '
Felix Kling
la source
18
La réponse de @simon est plus flexible et plus utile lors du formatage de chaînes plus complexes
CoatedMoose
3
ou @abbot si vous êtes bloqué sur les anciennes versions de python
CoatedMoose
1
ljust () est désormais obsolète. Voir stackoverflow.com/questions/14776788/… pour la bonne façon de le faire
Mawg dit réintégrer Monica le
Son disparu en python 3? Je voulais juste ajouter qu'il y a aussi juste et centre qui fonctionnent de la même manière mais pour des alignements différents
radtek
17
ljust (), rjust () ont été dépréciés du module chaîne uniquement. Ils sont disponibles sur le type str intégré.
Rohan Grover
374

Pour une méthode flexible qui fonctionne même lors du formatage d'une chaîne compliquée, vous devez probablement utiliser le mini-langage de formatage de chaîne , en utilisant soit la str.format()méthode

>>> '{0: <16} StackOverflow!'.format('Hi')  # Python >=2.6
'Hi               StackOverflow!'

de f-cordes

>>> f'{"Hi": <16} StackOverflow!'  # Python >= 3.6
'Hi               StackOverflow!'
Simon
la source
11
Et si vous avez «16» dans une variable?
Randy
Je l'ai aussi compris. Aurait dû l'afficher. Les documents indiquent que cela devrait fonctionner pour Py2.6, mais mes conclusions sont différentes. Fonctionne cependant dans Py2.7.
Randy
1
J'ai eu des problèmes avec ce type de formatage lorsque j'utilisais des accents nationaux. Vous voudriez que «kra» et «krá» soient les mêmes, mais ils ne l'étaient pas.
quapka
77
@Randy'{message: <{fill}}'.format(message='Hi', fill='16')
CivFan
19
Ne pas utiliser str.format()pour les modèles avec un seul {...}et rien d'autre. Il suffit d' utiliser la format()fonction et vous épargner l'analyse des frais généraux: format('Hi', '<16').
Martijn Pieters
119

La nouvelle méthode de format de chaîne (ish) vous permet de faire des choses amusantes avec des arguments de mots clés imbriqués. Le cas le plus simple:

>>> '{message: <16}'.format(message='Hi')
'Hi             '

Si vous souhaitez passer en 16tant que variable:

>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi              '

Si vous souhaitez transmettre des variables pour l' ensemble du kit et kaboodle :

'{message:{fill}{align}{width}}'.format(
   message='Hi',
   fill=' ',
   align='<',
   width=16,
)

Ce qui se traduit par (vous l'avez deviné):

'Hi              '
CivFan
la source
Comment géreriez-vous également la variation du message? msgs = ['salut', 'bonjour', 'ciao']
ak_slick
1
@ak_slick Vous pouvez passer des variables au lieu de valeurs codées en dur dans la fonction format.
CivFan
80

Vous pouvez essayer ceci:

print "'%-100s'" % 'hi'
abbé
la source
imprimer "'% -6s'"% 'salut' en effet !!
taper
8
@simon comme quelqu'un bloqué sur un système python2.5 cette réponse m'a aidé, pas une réponse inutile +1
sunshinekitty
18
Plus obsolète en 3.3+
Seppo Erviälä
3
J'aime beaucoup mieux cette syntaxe printf commune. Vous permet d'écrire des chaînes complexes sans innombrables concaténations.
Max Tsepkov
4
Pour être complet, "'%+100s'" % 'hi'fonctionnerait pour mettre des espaces à droite de'hi'
Eric Blum
63

La bonne façon de procéder serait d'utiliser la syntaxe de format de Python comme décrit dans la documentation officielle

Dans ce cas, il s'agirait simplement: des
'{:10}'.format('hi')
sorties:
'hi '

Explication:

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

À peu près tout ce que vous devez savoir est là ^.

Mise à jour: à partir de python 3.6, c'est encore plus pratique avec une interpolation de chaîne littérale!

foo = 'foobar'
print(f'{foo:10} is great!')
# foobar     is great!
Granitosaurus
la source
37

Utilisation str.ljust():

>>> 'Hi'.ljust(6)
'Hi    '

Vous devriez également considérer string.zfill(), str.ljust()et str.center()pour le formatage des chaînes. Ceux-ci peuvent être enchaînés et avoir le caractère ' fill ' spécifié, ainsi:

>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
'        00000003   blindmice....        '

Ces opérations de formatage de chaînes ont l'avantage de fonctionner en Python v2 et v3.

Jetez un oeil à un moment pydoc str: il y a une multitude de bonnes choses là-dedans.

Johnsyweb
la source
27

Depuis Python 3.6, vous pouvez simplement faire

>>> strng = 'hi'
>>> f'{strng: <10}'

avec interpolation de chaîne littérale .

Ou, si votre taille de rembourrage est dans une variable, comme ceci (merci @Matt M.!):

>>> to_pad = 10
>>> f'{strng: <{to_pad}}'
WAF
la source
4
f'{strng: >10}'pour remplir la chaîne avec un espace de tête à une longueur de 10. C'est magique. Et ce n'est pas bien documenté.
Chang Ye
@changye Je crois que c'est aussi le comportement par défaut de f'{strng:10}'.
WAF
17

vous pouvez également centrer votre chaîne:

'{0: ^20}'.format('nice')
Rémi
la source
7

Utilisez le mini formatage de Python 2.7 pour les chaînes :

'{0: <8}'.format('123')

Cette gauche s'aligne et remplit à 8 caractères avec le caractère ''.

aodj
la source
4
@simon a déjà donné cette réponse ... pourquoi publier une réponse en double?
Felix Kling
5
Je n'ai pas cliqué sur «les nouvelles réponses ont été publiées, cliquez pour rafraîchir» et je l'ai donc raté.
aodj
5

Supprimez simplement le 0 et cela ajoutera de l'espace à la place:

>>> print  "'%6d'"%4
Amir Mofakhar
la source
2

Ne serait-il pas plus pythonique d'utiliser le découpage?

Par exemple, pour remplir une chaîne avec des espaces à droite jusqu'à 10 caractères:

>>> x = "string"    
>>> (x + " " * 10)[:10]   
'string    '

Pour le remplir avec des espaces sur la gauche jusqu'à 15 caractères:

>>> (" " * 15 + x)[-15:]
'         string'

Cela nécessite de savoir combien de temps vous voulez remplir, bien sûr, mais cela ne nécessite pas de mesurer la longueur de la chaîne avec laquelle vous commencez.

Zev Chonoles
la source
9
Non, ce ne serait pas le cas.
Mad Physicist
1
Pourriez-vous préciser ceci? Ce n'est pas que je ne te crois pas, je veux juste comprendre pourquoi.
Zev Chonoles du
4
Sûr. La manière la plus pythonique serait d'utiliser l'une des fonctions intégrées plutôt que d'utiliser autant que possible une solution locale.
Mad Physicist
@MadPhysicist disant que le découpage est moins pythonique parce que vous devriez utiliser des fonctions intégrées, c'est comme dire que ''.join(reversed(str))c'est plus pythonique que str[::-1], et nous savons tous que ce n'est pas vrai.
Nick
@NickA. Ce n'est pas une très bonne analogie. Le cas que vous utilisez comme exemple est tout à fait valable. Cependant, (x + " " * 10)[:10]est à mon avis beaucoup plus compliqué que l'utilisation x.ljust(10).
Mad Physicist
0

Une bonne astuce à utiliser à la place des différents formats d'impression:

(1) Pad avec des espaces à droite:

('hi' + '        ')[:8]

(2) Pad avec des zéros à gauche sur la gauche:

('0000' + str(2))[-4:]
Erik Anderson
la source
1
Pour une raison quelconque, c'est la réponse la plus drôle, mais j'aime ça. Dans ce sens, considérez également: min_len = 8alors ('hi' + ' '*min_len)[:min_len]ou('0'*min_len + str(2))[-min_len]
Poikilos
1
Pour le nombre, ce serait ('0'*min_len + str(2))[-min_len:]plutôt, même si ce n'est que pour le plaisir, et je recommande les autres réponses.
Poikilos
-1

Vous pourriez le faire en utilisant la compréhension de la liste, cela vous donnerait également une idée du nombre d'espaces et serait une ligne.

"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello                 '
foobar666
la source
... et ensuite vous obtenez une chaîne de 22 (len ("bonjour") + 17 :() caractères de long - cela ne s'est pas bien passé. Bien que nous soyons drôles, nous pourrions le faire s = "hi"; à la s + (6-len(s)) * " "place (c'est ok quand le résultat est négatif) Cependant, les réponses qui utilisation quelle que soit fonction de cadre qui aborde la question exacte sera plus facile à maintenir (voir d' autres réponses)..
poikilos