Formatage de Chaînes Python

Extrait de la documentation Python 3

Les opérations de formatage décrites ici (opérateur %) présentent diverses particularités qui entraînent un certain nombre d'erreurs courantes [...]. L'utilisation des littéraux de chaîne formatés plus récents [...] aide à éviter ces erreurs. Ces alternatives offrent également des approches plus puissantes, flexibles et extensibles pour le formatage de texte.

opérateur %

Privilégier les littéraux de chaîne

Pour le nouveau code, il est fortement recommandé d'utiliser str.format, ou les littéraux de chaîne formatés (Python 3.6+) plutôt que l'opérateur %.

# opérateur % : formatage de chaîne de style ancien (non recommandé pour le nouveau code)
name = 'Pete'
'Hello %s' % name  # %s = placeholder de chaîne
"Hello Pete"

Nous pouvons utiliser le spécificateur de format %d pour convertir une valeur entière en chaîne :

num = 5
'I have %d apples' % num
"I have 5 apples"

str.format

Python 3 a introduit une nouvelle façon de formater les chaînes, qui a ensuite été rétroportée vers Python 2.7. Cela rend la syntaxe du formatage de chaîne plus régulière.

# méthode str.format() : formatage de chaîne moderne (Python 2.7+)
name = 'John'
age = 20

"Hello I'm {}, my age is {}".format(name, age)  # {} = placeholder
"Hello I'm John, my age is 20"
"Hello I'm {0}, my age is {1}".format(name, age)
"Hello I'm John, my age is 20"

Littéraux de Chaîne Formatés ou f-Strings

Si vous utilisez Python 3.6+, les f-Strings de chaîne sont la méthode recommandée pour formater les chaînes.

Extrait de la documentation Python 3

Un littéral de chaîne formaté ou f-string est un littéral de chaîne préfixé par f ou F. Ces chaînes peuvent contenir des champs de remplacement, qui sont des expressions délimitées par des accolades {}. Alors que les autres littéraux de chaîne ont toujours une valeur constante, les chaînes formatées sont de véritables expressions évaluées à l'exécution.

# f-string : méthode recommandée pour formater les chaînes (Python 3.6+)
name = 'Elizabeth'
f'Hello {name}!'  # Le préfixe f permet les expressions dans {}
'Hello Elizabeth!'
Quiz

Connectez-vous pour répondre à ce quiz et suivre votre progression d'apprentissage

Quel préfixe est utilisé pour les f-strings en Python ?
A. fmt
B. f ou F
C. format
D. str

Il est même possible d’effectuer des calculs en ligne avec :

# Les f-strings supportent les expressions : peuvent inclure des calculs à l'intérieur de {}
a = 5
b = 10
f'Five plus ten is {a + b} and not {2 * (a + b)}.'  # Évalue les expressions
'Five plus ten is 15 and not 30.'

f-Strings sur Plusieurs Lignes

name = 'Robert'
messages = 12
(
f'Hi, {name}. '
f'You have {messages} unread messages'
)
'Hi, Robert. You have 12 unread messages'

Le spécificateur =

Ceci affichera l’expression et sa valeur :

# Spécificateur = : affiche à la fois le nom de la variable et sa valeur (Python 3.8+)
from datetime import datetime
now = datetime.now().strftime("%b/%d/%Y - %H:%M:%S")
f'date and time: {now=}'  # Affiche "now='Nov/14/2022 - 20:50:01'"
"date and time: now='Nov/14/2022 - 20:50:01'"

Ajout d’espaces ou de caractères

name = 'Robert'
f"{name.upper() = :-^20}"
'name.upper() = -------ROBERT-------'
f"{name.upper() = :^20}"
'name.upper() =        ROBERT       '
f"{name.upper() = :20}"
'name.upper() = ROBERT              '

Formatage des Chiffres

Ajout du séparateur de milliers

a = 10000000
f"{a:,}"
'10,000,000'

Arrondissement

a = 3.1415926
f"{a:.2f}"
'3.14'
Quiz

Connectez-vous pour répondre à ce quiz et suivre votre progression d'apprentissage

Que fait f"{a:.2f}" ?
A. Arrondit le nombre à l'entier le plus proche
B. Formate en pourcentage
C. Formate le nombre en flottant avec 2 décimales
D. Convertit en notation scientifique

Affichage en Pourcentage

a = 0.816562
f"{a:.2%}"
'81.66%'

Tableau de formatage des nombres

NombreFormatSortieDescription
3.1415926{:.2f}3.14Formater le flottant avec 2 décimales
3.1415926{:+.2f}+3.14Formater le flottant avec 2 décimales et signe
-1{:+.2f}-1.00Formater le flottant avec 2 décimales et signe
2.71828{:.0f}3Formater le flottant sans décimales
4{:0>2d}04Remplir le nombre avec des zéros (remplissage gauche, largeur 2)
4{:x<4d}4xxxRemplir le nombre avec des x (remplissage droite, largeur 4)
10{:x<4d}10xxRemplir le nombre avec des x (remplissage droite, largeur 4)
1000000{:,}1,000,000Format de nombre avec séparateur de virgule
0.35{:.2%}35.00%Formater le pourcentage
1000000000{:.2e}1.00e+09Notation exponentielle
11{:11d}11Alignement à droite (par défaut, largeur 10)
11{:<11d}11Alignement à gauche (largeur 10)
11{:^11d}11Alignement centré (largeur 10)

Chaînes de Modèles (Template Strings)

Un mécanisme plus simple et moins puissant, mais il est recommandé lors du traitement de chaînes générées par l’utilisateur. En raison de leur complexité réduite, les chaînes de modèles sont un choix plus sûr.

from string import Template
name = 'Elizabeth'
t = Template('Hey $name!')
t.substitute(name=name)
'Hey Elizabeth!'

Liens pertinents