Tutoriel Python : gérer les dates avec la méthode format

Python offre une pléthore de possibilités pour appliquer un format de sortie. Dans ce tutoriel, découvrez comment afficher des chaînes de caractères ou des dates avec un certain format avec la méthode format et les f-string.

Auteur René Degen
Date 14.02.2023
Temps de lecture 12 Minutes

L’affichage soigné de résultats ou de messages d’erreurs est au scripte ce que la carte de visite est à l’homme d’affaires. Et en Python, c’est avec la méthode de chaîne de caractères .format() qu’on accède à un monde de possibilités quasi infinies pour lier des chaînes de caractères entre-elles. De plus, et depuis Python 3.6, les f-string permettent d’utiliser cette méthode de manière plus compacte.

La méthode format : qu’est-ce que c’est et que permet-elle de faire ?

Pour appliquer un format aux chaînes, Python 3 propose la méthode .format(). Au sein d’une chaîne de caractères, vous insérez des caractères de remplacement aux endroits où doit être inséré le contenu de la variable, que vous déterminez ensuite.

Ces caractères de remplacement sont des accolades qui peuvent être identifiées soit par des chiffres, soit par des chaînes de caractère ou encore par leur position.

Les différentes formes peuvent aussi être mélangées. Mais regardons concrètement à quoi cela ressemble dans l’interpréteur :

 
>>> #Numérotation des accolades
>>> "{0} est {1}".format("Python", "amusant")
'Python est amusant'

Les accolades sont numérotées à partir de 0 et les paramètres de la méthode format définis ensuite. Cette numérotation est facultative et peut donc être ignorée. Les objets sont alors insérés dans l’ordre d’énumération :

 
>>> #Position des accolades
>>> "{} fait {}".format("La vache", "meuh")
'La vache fait meuh'

On peut aussi nommer nos accolades, ce qui a l’avantage de pouvoir appliquer le même objet à plusieurs endroits différents. Ici, nous voulons ajouter la monnaie deux fois :

 
>>> #Accolades avec et sans noms et avec des paramètres de position
>>> "Coûts : {curr} {}, TVA : {curr} {}".format(100, 7.7, curr='CHF')
'Coûts : CHF 100, TVA : CHF 7.7'

Peu importe la forme choisie, à l’utilisation, tout cela peut sembler un peu encombrant. Si dans l’exemple ci-dessus, la monnaie « CHF » n’était pas hardcodée, mais entrée dans une variable au nom de curr, la définition comporterait une redondance inesthétique.

 
>>> curr = 'EUR'
>>> "Coûts : {curr} {}, TVA : {curr} {}".format(80,20, curr=curr)
'Coûts : EUR 80, TVA : EUR 20'

La f-string

Avec la version 3.6 de Python a débarqué la formatted string literals  ou f”” pour les intimes. Cette forme impose certes la définition de chaque variable, mais est bien plus rapide à utiliser et, si on se donne la peine de donner de bons noms, plutôt lisible.

 
>>> curr = 'EUR'
>>> coûts = 80
>>> tva = coûts * 0.20
>>> # f-String
>>> f"Coûts : {curr} {coûts}, TVA : {curr} {tva}"
'Coûts : EUR 80, TVA : EUR 16.0'

Le formatage des chaînes de caractère ne permet plus seulement d’insérer des valeurs au sein de la chaîne de caractère, mais aussi d’indiquer différents formats pour chaque valeur. Dans la documentation en ligne de Python, cela s’appelle le « Format-Definition Mini Language ».

Les possibilités d’affichage (spécification du format) sont alors plus que suffisantes pour un usage quotidien et consistent essentiellement en l’alignement, le nombre de caractères, l’ajout éventuel d’un signe, le nombre de décimales et un type. La spécification du format suit le nom de la variable et un deux-points.

Regardons cela plus en détail à l’aide de quelques exemples, ici en utilisant la méthode print pour gagner de la place sur une ligne et pour rendre quand même visible la largeur identique :

 
>>> cur = 'CHF'
>>> cost = 42
>>> tva = cost * 0.077
>>> print(f"{'Base :':<6}{cur:>4}{cost:>6.2f}\n{'TVA :':<6}{cur:>4}{tva:>6.2f}")
Basis: CHF 42.00
MwSt:  CHF  3.23

La monnaie est ici explicitement alignée sur la droite (avec le signe « > ») dans une chaîne de 4 caractères (« 4 »), alors que les montants sont affichés sous forme de float dans une chaîne de 6 caractères et 2 chiffres après la virgule – arrondi, donc – (« 6.2f »).

 
>>> l,r  = 'l', 'r'
>>> pos, neg = 20, -30
>>> print(f"Texte {l:<4} {r:_>4}\nChiffre {pos:0>4d} {neg:>4d}")
Texte l   ___r
Chiffre 0020  -30

Ici, on affiche un texte aligné une fois à gauche et une fois à droite, ce dernier complété de caractères de remplissage « _ », et on fait pareil avec des chiffres et « 0 » comme caractère de remplissage (ce qui est aussi beaucoup plus commun).

Il faut aussi noter que chaque accolade – si elle n’a pas de spécification de format – appelle la méthode de classe __str__ correspondante pour effectuer la tâche et construire la chaîne de caractère.

Les dates avec Python et la méthode format

Une des particularités, et malheureusement aussi une source de confusion, concerne les dates. Dans notre région culturelle, nous écrivons la date sous la forme de jour.mois.année et, depuis l’an 2000, j’espère que beaucoup ont pris l’habitude de ne plus abréger l’année aux deux derniers chiffres.

Je voudrais également profiter de l’occasion pour promouvoir l’affichage de la date prévue par la norme ISO 8601. La date est ici délivrée dans l’ordre de grandeur de l’unité, donc année, mois et jour (parfois suivi de l’heure, affichée de manière similaire). Pour une meilleure lisibilité, on utilise souvent le signe « – » pour séparer les unités. On écrira donc « 2022-05-01 » pour le 1er mai 2022.

Cette forme n’est pas ambiguë : elle n’est pas spécifique à un pays et il est également facile de trier des dates données sous cette forme.

 
>>> an, mois, jour, separ = 2022, 8, 1, '-'
>>> f"Date : {an:04d}{separ}{mois:02d}{separ}{jour:02d}"
'Date : 2022-08-01'

Ce format de date est également approprié pour former les noms de fichiers journaux quoi doivent être périodiquement créés. Vous en trouverez un exemple plus bas dans cet article.

En ce qui concerne l’affichage de date ou d’heure, d’autres méthodes de formatage sont disponibles dans la classe datetime.date avec la méthode strftime(), dont la syntaxe est par ailleurs orientée sur les bibliothèques C standard. Ici, le format de sortie est contrôlé par le signe % et presque chaque lettre a une propre signification.

Dans ce contexte, définissons l’objet date sur la dernière fête nationale :

 
>>> from datetime import date
>>> d = date.fromisoformat('2022-08-01')
>>> d
datetime.date(2022, 8, 1)
>>> print(d)
2022-08-01
>>> date(2022, 8, 1)
'2022-08-01'
>>> # Quelle est la date d’aujourd’hui ?
>>> date.today().isoformat()
'2023-02-07'

La valeur par défaut de la représentation en chaîne de caractère d’un objet date est donc aussi le format ISO tel qu’il est disponible par la méthode isoformat(). Mais nous voulons afficher des formats particuliers :

 
>>> # Formats avec strftime
>>> d.strftime('%Y-%m-%d')
'2022-08-01'
>>> d.strftime('La semaine calendaire %V est plus courte, le %we jour (%A) est férié')
'La semaine calendaire 31 est plus courte, le 1er jour (Monday) est férié'

Les lettres « Y », « m » et « d » représentent de manière assez transparente l’année (Year), le mois (month) et le jour (day) ; il faut cependant respecter la casse (majuscule/minuscule). Je laisse à la fantaisie des lectrices et lecteurs d’imaginer ce que « M » signifie, ou, si leur curiosité est maintenant piquée, de le découvrir dans la documentation de la classe datetime.

La lettre « V » représente la semaine calendaire selon la norme ISO, « w » le numéro du jour de la semaine et « A » permet l’affichage de la donnée en texte. Si tout cela vous semble aller trop dans les détails, tout ce que vous avez à retenir, c’est qu’en août 2022, nous avons bénéficié d’un week-end prolongé, puisque la fête nationale est tombée un lundi.

Et en ce qui concerne les fichiers journaux (log data) ?

 
>>> logdatei = "application{}.log".format(date.today())
>>> logdatei
'application2023-02-07.log'

On garantit ainsi que les logs de l’application sont écrits quotidiennement dans un nouveau fichier, à condition que le nom du fichier soit calculé juste avant son exécution. La rotation des logs s’effectue ensuite en dehors de l’application selon les directives de l’entreprise concernant la confidentialité, la traçabilité ou la capacité de stockage.

Apprenez à programmer en Python avec Digicomp

L’avenir de Python s’annonce radieux. Initiez-vous dès maintenant à Python ou perfectionnez vos connaissances de ce langage de programmation grâce à l’une de nos formations :

Introduction à la programmation Python
Cette formation de base permet de découvrir le langage de programmation Python, sa syntaxe et ses bibliothèques.

Python – Concepts avancés
Approfondissez vos connaissances de Python et familiarisez-vous avec les concepts avancés tels que la programmation fonctionnelle et le développement orienté objet. Apprenez également à débugger et profiler vos programmes.

Python – Data Scientist
Familiarisez-vous avec les concepts d’analyse et de visualisation de données avec des modules tels que NumPy, Pandas, Matplotlib ou Seaborn.

L’avenir de Python s’annonce radieux. Initiez-vous dès maintenant à Python ou perfectionnez vos connaissances de ce langage de programmation grâce à l’une de nos formations :

Introduction à la programmation Python
Cette formation de base permet de découvrir le langage de programmation Python, sa syntaxe et ses bibliothèques.

Python – Concepts avancés
Approfondissez vos connaissances de Python et familiarisez-vous avec les concepts avancés tels que la programmation fonctionnelle et le développement orienté objet. Apprenez également à débugger et profiler vos programmes.

Python – Data Scientist
Familiarisez-vous avec les concepts d’analyse et de visualisation de données avec des modules tels que NumPy, Pandas, Matplotlib ou Seaborn.


A propos de l'auteur

René Degen

Sa première « ls » sur UNIX remonte il y a plus de 30 ans, mais il est toujours aussi enthousiaste. René Degen est ingénieur informatique diplômé de l’EPF, et, depuis une quinzaine d’années, actif en tant qu’indépendant sur des projets dans des banques ou des fournisseurs de services de télécommunication. Il officie également en tant que formateur chez Digicomp dans le domaine d’UNIX.