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.


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        '

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

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              '

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'

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!

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.


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

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

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


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

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.


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

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                 '

... 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.