Formatage de chaînes de caractères

8.4 Formatage de chaînes de caractères

Objectifs d'apprentissage

À la fin de cette section, vous devriez être en mesure de :

  • Formater un modèle de chaîne à l'aide d'arguments d'entrée.
  • Utiliser format() pour générer des formats numériques à partir d'un modèle donné.

Spécification de format de chaîne

Python fournit une syntaxe de substitution de chaînes pour formater des chaînes de caractères à l'aide d'arguments d'entrée. Une chaîne de formatage (formatting string) définit un modèle et les règles selon lesquelles les valeurs doivent être formatées. Les chaînes de formatage permettent notamment d'utiliser des modèles pour construire différentes valeurs de chaînes et de définir des règles pour la longueur et l'alignement de la chaîne.

Formatage de chaînes avec des champs de remplacement

Les champs de remplacement (replacement fields) servent à définir un modèle permettant de produire plusieurs chaînes selon un même format. L'exemple ci-dessous présente deux valeurs de chaînes qui utilisent le même modèle pour adresser des demandes à différentes personnes afin de suivre différents cours.

Exemple 8.5

Valeurs de chaînes issues du même modèle

    Dear John, I'd like to take a programming course with Prof. Potter.

    Dear Kishwar, I'd like to take a math course with Prof. Robinson.

Dans l'exemple ci-dessus, les champs de remplacement sont 1) le nom de la personne à qui la demande est adressée, 2) l'intitulé du cours, et 3) le nom de l'enseignant. Pour créer un modèle, des champs de remplacement peuvent être ajoutés avec {} afin d'indiquer un emplacement réservé pour l'entrée de l'utilisateur. La méthode format() est utilisée pour transmettre les entrées destinées aux champs de remplacement dans un modèle de chaîne.

Exemple 8.6

Formatage d'un modèle de chaîne pour des demandes d'inscription à des cours

Un modèle de chaîne comportant des champs de remplacement est défini ci-dessous afin de créer des valeurs de chaînes avec différents arguments d'entrée. La méthode format() est utilisée pour transmettre les entrées au modèle dans le même ordre.

    s = "Dear {}, I'd like to take a {} course with Prof. {}."

    print(s)
    print(s.format("John", "programming", "Potter"))
    print(s.format("Kishwar", "math", "Robinson"))

La sortie du code ci-dessus est :

    Dear {}, I'd like to take a {} course with Prof. {}.
    Dear John, I'd like to take a programming course with Prof. Potter.
    Dear Kishwar, I'd like to take a math course with Prof. Robinson.

Concepts en pratique

Modèle de chaîne et formatage

1.
Quelle est la sortie de print("Hello {}!".format("Ana")) ?
  1. Ana
  2. Hello Ana
  3. Hello Ana!
2.
Quelle est la sortie de print("{}:{}".format("One", "1")) ?
  1. One1
  2. One:1
  3. 1:One
3.
Quelle est la sortie de print("{}".format("one", "two", "three")) ?
  1. one
  2. two
  3. onetwothree

Champs de remplacement nommés

Les champs de remplacement peuvent être associés à une étiquette, appelés champs de remplacement nommés (named replacement fields), pour faciliter l'accès et améliorer la lisibilité du code. L'exemple ci-dessous illustre l'utilisation des champs de remplacement nommés dans des modèles de chaînes.

Exemple 8.7

Modèle météorologique saisonnier utilisant des champs de remplacement nommés

Un argument de remplacement nommé constitue un moyen pratique d'attribuer des étiquettes de noms aux champs de remplacement et de transmettre les valeurs associées aux champs de remplacement à l'aide des noms correspondants (au lieu de transmettre les valeurs dans l'ordre).

    s = "Weather in {season} is {temperature}."

    print(s)
    print(s.format(season = "summer", temperature = "hot"))
    print(s.format(season = "winter", temperature = "cold"))

La sortie du code ci-dessus est :

    Weather in {season} is {temperature}.
    Weather in summer is hot.
    Weather in winter is cold.

Utilisation multiple d'un argument nommé

Puisque l'on fait référence aux champs de remplacement nommés à l'aide d'une clé de nom, un champ de remplacement nommé peut apparaître et être utilisé plus d'une fois dans le modèle. De plus, l'ordre positionnel n'est pas nécessaire lorsque des champs de remplacement nommés sont utilisés.

    s = "Weather in {season} is {temperature}; very very {temperature}."

    print(s)
    print(s.format(season = "summer", temperature = "hot"))
    print(s.format(temperature = "cold", season = "winter"))

La sortie du code ci-dessus est :

    Weather in {season} is {temperature}; very very {temperature}.
    Weather in summer is hot; very very hot.
    Weather in winter is cold; very very cold.

Concepts en pratique

Exemples de champs de remplacement nommés

4.
Quelle est la sortie de print("Hey {name}!".format(name = "Bengio")) ?
  1. Hey name!
  2. Hey Bengio
  3. Hey Bengio!
5.
Quelle est la sortie de print("Hey {name}!".format("Bengio")) ?
  1. Hey name!
  2. KeyError
  3. Hey Bengio!
6.
Quelle est la sortie du code suivant ?
greeting = "Hi"
name = "Jess"
print("{greeting} {name}".format(greeting = greeting, name = name))
  1. greeting name
  2. Hi Jess
  3. Jess Hi

Champs de remplacement numérotés

La méthode de chaîne format() de Python peut utiliser l'ordre positionnel pour faire correspondre les arguments numérotés. Les champs de remplacement qui utilisent l'ordre positionnel des arguments sont appelés champs de remplacement numérotés (numbered replacement fields). L'indexation des arguments commence à 0. Ex. : print("{1}{0}".format("Home", "Welcome")) produit la valeur de chaîne "Welcome Home" comme premier argument. "Home" est à l'indice 0, et le second argument, "Welcome", est à l'indice 1. Remplacer ces arguments dans l'ordre "{1}{0}" crée la chaîne "Welcome Home".

Les champs de remplacement numérotés peuvent réutiliser les valeurs d'un argument pour plusieurs champs de remplacement en utilisant le même indice d'argument. L'exemple ci-dessous illustre comment un argument est utilisé pour plusieurs champs de remplacement numérotés.

Exemple 8.8

Champ de remplacement numéroté pour construire une phrase

Des champs de remplacement numérotés sont utilisés dans cet exemple pour construire des phrases telles que "very very cold" ou "very hot".

    template1 = "{0} {0} {1}"
    template2 = "{0} {1}"

    print(template1.format("very", "cold"))
    print(template2.format("very", "hot"))

La sortie du code ci-dessus est :

    very very cold
    very hot

Formatage de la longueur et de l'alignement des chaînes

Le formatage de la longueur de chaîne peut être nécessaire pour normaliser le style de sortie lorsque plusieurs valeurs de chaînes d'un même contexte sont créées et affichées. L'exemple ci-dessous montre un cas d'utilisation du formatage de chaînes lors de l'affichage d'un tableau comportant des colonnes de longueur minimale et un alignement spécifique.

Exemple 8.9

Un tableau formaté d'une liste d'étudiants

Un tableau formaté d'une liste d'étudiants

    Student Name              Major          Grade
    ----------------------------------------------
    Manoj Sara          Computer Science        A-
    Gabriel Wang     Electrical Engineering      A
    Alex Narayanan       Social Sciences        A+

Dans l'exemple ci-dessus, le tableau est formaté en trois colonnes. La première colonne occupe 15 caractères et est alignée à gauche. La deuxième colonne utilise 25 caractères et est centrée, et la dernière colonne utilise deux caractères et est alignée à droite. Les contrôles de spécification de format d'alignement et de longueur sont utilisés pour créer le tableau formaté.

La largeur de champ dans la spécification de format de chaîne est utilisée pour spécifier la longueur minimale de la chaîne donnée. Si la chaîne est plus courte que la longueur minimale indiquée, elle sera complétée par des caractères d'espacement. Une largeur de champ (field width) est incluse dans le champ de spécification de format à l'aide d'un entier après un deux-points. Ex. : {name:15} spécifie que la longueur minimale des valeurs de chaîne transmises au champ name est de 15.

Comme la largeur de champ peut être utilisée pour spécifier la longueur minimale d'une chaîne, celle-ci peut être complétée par des caractères d'espacement à droite, à gauche ou des deux côtés pour être respectivement alignée à gauche, alignée à droite ou centrée. Le type d'alignement de chaîne (string alignment type) est spécifié à l'aide des caractères <, > ou ^ après le deux-points lorsque la longueur de champ est spécifiée. Ex. : {name:^20} spécifie un champ de remplacement nommé d'une longueur minimale de 20 caractères qui est centré.

Type d'alignement Symbole Exemple Sortie
Aligné à gauche

<

template = "{hex:<7}{name:<10}" print(template.format(hex = "#FF0000", name = "Red")) print(template.format(hex = "#00FF00", name = "green"))

#FF0000Red #00FF00green

Aligné à droite

>

template = "{hex:>7}{name:>10}" print(template.format(hex = "#FF0000", name = "Red")) print(template.format(hex = "#00FF00", name = "green"))

#FF0000          Red #00FF00        green

Centré ^

template = "{hex:^7}{name:^10}" print(template.format(hex = "#FF0000", name = "Red")) print(template.format(hex = "#00FF00", name = "green"))

#FF0000   Red #00FF00  green

Tableau 8.2 Formatage de l'alignement des chaînes de caractères.

Concepts en pratique

Spécifier la largeur de champ et l'alignement

7.
Quelle est la sortie du code suivant ?
template = "{name:12}"
formatted_name = template.format(name = "Alice")
print(len(formatted_name))
  1. 5
  2. 12
  3. "Alice"
8.
Quelle est la sortie du code suivant ?
template = "{greeting:>6}"
formatted_greeting = template.format(greeting = "Hello")
print(formatted_greeting[0])
  1. H
  2. " Hello"
  3. Caractère espace
9.
Quelle est la sortie du code suivant ?
template = "{:5}"
print(template.format("123456789"))
  1. 56789
  2. 123456
  3. 123456789

Formatage des nombres

La méthode format() peut être utilisée pour formater des valeurs numériques. Les valeurs numériques peuvent être complétées pour avoir une longueur minimale donnée, une précision et un caractère de signe. La syntaxe pour modifier les valeurs numériques suit la structure {[index]:[width][.precision][type]}. Dans la syntaxe donnée :

  • Le champ index fait référence à l'indice de l'argument.
  • Le champ width fait référence à la longueur minimale de la chaîne.
  • Le champ precision fait référence à la précision en virgule flottante du nombre donné.
  • Le champ type indique le type de l'entrée transmise à la méthode format(). Les entrées en virgule flottante et décimales (entières) sont identifiées respectivement par "f" et "d". Les valeurs de chaînes sont également identifiées par "s".

Le tableau ci-dessous résume les options de formatage pour modifier les valeurs numériques.

Exemple Sortie Explication

print("{:.7f}".format(0.9795))

0.9795000

La spécification de format .7 indique que la sortie doit comporter sept décimales. La spécification f est un identificateur de formatage en virgule flottante.

print("{:.3f}".format(12))

12.000

La spécification de format .3 indique que la sortie doit comporter trois décimales. La spécification f est un identificateur de formatage en virgule flottante.

print("{:+.2f}".format(4))

+4.00

La spécification de format .2 indique que la sortie doit comporter deux décimales. La spécification f est un identificateur de formatage en virgule flottante. Le signe + précédant la spécification de précision ajoute un caractère de signe à la sortie.

print("{:0>5d}".format(5))

00005

La spécification de format 0>5 définit la largeur de champ comme étant égale à 5, la sortie devant ainsi avoir une longueur minimale de 5. De plus, si le nombre comporte moins de cinq chiffres, il doit être complété par des 0 à gauche. La spécification d est un identificateur de formatage de nombre décimal.

print("{:.3s}".format("12.50"))

12.

La spécification de format .3 indique que la sortie comportera trois caractères. La spécification s est un identificateur de formatage de chaîne de caractères.

Tableau 8.3 Options de formatage numérique.

Concepts en pratique

Exemples de formatage de valeurs numériques

10.
Quelle est la sortie de print('{0:.3f}'.format(3.141592)) ?
  1. 3.141592
  2. 3.1
  3. 3.142
11.
Quelle est la sortie de print('{:1>3d}'.format(3)) ?
  1. 113
  2. 311
  3. 3.000
12.
Quelle est la sortie de print('{:+d}'.format(123)) ?
  1. 123
  2. +123
  3. :+123

À vous d'essayer

Formater une liste de nombres

Étant donné une liste de nombres (à virgule flottante ou entiers), affichez les nombres avec une précision de deux décimales et au moins six caractères.

    Input: [12.5, 2]
    Prints: 012.50
    
    002:00