Skip to content

Obtenir un calendrier sous forme de texte, HTML, liste en Python

En Python, vous pouvez obtenir et générer des calendriers sous forme de texte brut, HTML ou une liste avec le module de calendrier dans la bibliothèque standard.

Cet article décrit le contenu suivant.

  • Obtenir/sortir les calendriers en texte brut
    • Calendrier mensuel
    • Calendrier annuel
    • Définir le premier jour de la semaine
    • Modifier les paramètres régionaux et les noms des jours de la semaine
  • Obtenir/afficher les calendriers sous forme de tableau HTML
    • Calendrier mensuel
    • Calendrier annuel
    • Définir les classes CSS
    • Définir le premier jour de la semaine
    • Modifier les paramètres régionaux et les noms des jours de la semaine
  • Obtenir des calendriers sous forme de liste
    • Liste des numéros
    • Liste des tuples
    • Liste de datetime.date
  • Sur la ligne de commande

Le module de calendrier fournit également des fonctions utiles pour les années bissextiles.

Obtenir/sortir les calendriers en texte brut

Calendrier mensuel

Vous pouvez obtenir le calendrier de n’importe quelle année et mois sous forme de chaîne (str) avec calendar.month().

import calendar

print(calendar.month(2019, 1))
#     January 2019
# Mo Tu We Th Fr Sa Su
#     1  2  3  4  5  6
#  7  8  9 10 11 12 13
# 14 15 16 17 18 19 20
# 21 22 23 24 25 26 27
# 28 29 30 31
# 

print(type(calendar.month(2019, 1)))
# <class 'str'>

La largeur de colonne peut être spécifiée avec le paramètre w et la largeur de ligne avec le paramètre l.

print(calendar.month(2019, 1, w=3, l=2))
#         January 2019
# 
# Mon Tue Wed Thu Fri Sat Sun
# 
#       1   2   3   4   5   6
# 
#   7   8   9  10  11  12  13
# 
#  14  15  16  17  18  19  20
# 
#  21  22  23  24  25  26  27
# 
#  28  29  30  31
# 
# 

La même chaîne peut être sortie avec calendar.prmonth().

calendar.prmonth(2019, 1)
#     January 2019
# Mo Tu We Th Fr Sa Su
#     1  2  3  4  5  6
#  7  8  9 10 11 12 13
# 14 15 16 17 18 19 20
# 21 22 23 24 25 26 27
# 28 29 30 31

Calendrier annuel

calendar.calendar() renvoie le calendrier annuel.

print(calendar.calendar(2019))
#                                   2019
# 
#       January                   February                   March
# Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
#     1  2  3  4  5  6                   1  2  3                   1  2  3
#  7  8  9 10 11 12 13       4  5  6  7  8  9 10       4  5  6  7  8  9 10
# 14 15 16 17 18 19 20      11 12 13 14 15 16 17      11 12 13 14 15 16 17
# 21 22 23 24 25 26 27      18 19 20 21 22 23 24      18 19 20 21 22 23 24
# 28 29 30 31               25 26 27 28               25 26 27 28 29 30 31
# 
#        April                      May                       June
# Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
#  1  2  3  4  5  6  7             1  2  3  4  5                      1  2
#  8  9 10 11 12 13 14       6  7  8  9 10 11 12       3  4  5  6  7  8  9
# 15 16 17 18 19 20 21      13 14 15 16 17 18 19      10 11 12 13 14 15 16
# 22 23 24 25 26 27 28      20 21 22 23 24 25 26      17 18 19 20 21 22 23
# 29 30                     27 28 29 30 31            24 25 26 27 28 29 30
# 
#         July                     August                  September
# Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
#  1  2  3  4  5  6  7                1  2  3  4                         1
#  8  9 10 11 12 13 14       5  6  7  8  9 10 11       2  3  4  5  6  7  8
# 15 16 17 18 19 20 21      12 13 14 15 16 17 18       9 10 11 12 13 14 15
# 22 23 24 25 26 27 28      19 20 21 22 23 24 25      16 17 18 19 20 21 22
# 29 30 31                  26 27 28 29 30 31         23 24 25 26 27 28 29
#                                                     30
# 
#       October                   November                  December
# Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
#     1  2  3  4  5  6                   1  2  3                         1
#  7  8  9 10 11 12 13       4  5  6  7  8  9 10       2  3  4  5  6  7  8
# 14 15 16 17 18 19 20      11 12 13 14 15 16 17       9 10 11 12 13 14 15
# 21 22 23 24 25 26 27      18 19 20 21 22 23 24      16 17 18 19 20 21 22
# 28 29 30 31               25 26 27 28 29 30         23 24 25 26 27 28 29
#                                                     30 31
# 

print(type(calendar.calendar(2019)))
# <class 'str'>

Vous pouvez spécifier le nombre de mois à produire par ligne avec le paramètre m. La valeur par défaut est de trois mois par ligne (= trois colonnes). De plus, vous pouvez spécifier le nombre d’espaces entre les mois avec le paramètre c.

Bien qu’omis dans l’exemple suivant, vous pouvez spécifier la largeur des lignes et des colonnes de chaque mois avec les paramètres w et l comme calendar.month().

print(calendar.calendar(2019, c=3, m=4))
#                                            2019
# 
#       January                February                March                  April
# Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su
#     1  2  3  4  5  6                1  2  3                1  2  3    1  2  3  4  5  6  7
#  7  8  9 10 11 12 13    4  5  6  7  8  9 10    4  5  6  7  8  9 10    8  9 10 11 12 13 14
# 14 15 16 17 18 19 20   11 12 13 14 15 16 17   11 12 13 14 15 16 17   15 16 17 18 19 20 21
# 21 22 23 24 25 26 27   18 19 20 21 22 23 24   18 19 20 21 22 23 24   22 23 24 25 26 27 28
# 28 29 30 31            25 26 27 28            25 26 27 28 29 30 31   29 30
# 
#         May                    June                   July                  August
# Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su
#        1  2  3  4  5                   1  2    1  2  3  4  5  6  7             1  2  3  4
#  6  7  8  9 10 11 12    3  4  5  6  7  8  9    8  9 10 11 12 13 14    5  6  7  8  9 10 11
# 13 14 15 16 17 18 19   10 11 12 13 14 15 16   15 16 17 18 19 20 21   12 13 14 15 16 17 18
# 20 21 22 23 24 25 26   17 18 19 20 21 22 23   22 23 24 25 26 27 28   19 20 21 22 23 24 25
# 27 28 29 30 31         24 25 26 27 28 29 30   29 30 31               26 27 28 29 30 31
# 
#      September               October                November               December
# Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su   Mo Tu We Th Fr Sa Su
#                    1       1  2  3  4  5  6                1  2  3                      1
#  2  3  4  5  6  7  8    7  8  9 10 11 12 13    4  5  6  7  8  9 10    2  3  4  5  6  7  8
#  9 10 11 12 13 14 15   14 15 16 17 18 19 20   11 12 13 14 15 16 17    9 10 11 12 13 14 15
# 16 17 18 19 20 21 22   21 22 23 24 25 26 27   18 19 20 21 22 23 24   16 17 18 19 20 21 22
# 23 24 25 26 27 28 29   28 29 30 31            25 26 27 28 29 30      23 24 25 26 27 28 29
# 30                                                                   30 31
# 

La même chaîne peut être sortie avec calendar.prcal(). La sortie est omise ici.

Définir le premier jour de la semaine

Comme dans les exemples précédents, les calendriers ont le lundi comme premier jour de la semaine par défaut.

Vous pouvez définir n’importe quel premier jour de la semaine avec calendar.setfirstweekday().

calendar.setfirstweekday(calendar.SUNDAY)

print(calendar.month(2019, 1))
#     January 2019
# Su Mo Tu We Th Fr Sa
#        1  2  3  4  5
#  6  7  8  9 10 11 12
# 13 14 15 16 17 18 19
# 20 21 22 23 24 25 26
# 27 28 29 30 31
# 

Calendar.MONDAY et calendar.SUNDAY sont des alias, où MONDAY vaut 0 et SUNDAY vaut 6. Vous pouvez spécifier une valeur entière pour calendar.setfirstweekday().

Vous pouvez vérifier les paramètres actuels avec calendar.firstweekday().

print(calendar.MONDAY)
# 0

print(calendar.SUNDAY)
# 6

calendar.setfirstweekday(0)

print(calendar.month(2019, 1))
#     January 2019
# Mo Tu We Th Fr Sa Su
#     1  2  3  4  5  6
#  7  8  9 10 11 12 13
# 14 15 16 17 18 19 20
# 21 22 23 24 25 26 27
# 28 29 30 31
# 

print(calendar.firstweekday())
# 0

Modifier les paramètres régionaux et les noms des jours de la semaine

Les noms des jours de la semaine dépendent des paramètres régionaux.

En créant un objet calendar.LocaleTextCalendar avec les paramètres régionaux et en appelant ses différentes méthodes, vous pouvez générer des calendriers avec des noms de jours de la semaine correspondant à ces paramètres régionaux. Dans l’exemple ci-dessous, il est défini sur l’allemand.

ltc_de = calendar.LocaleTextCalendar(locale='de_de')

print(ltc_de.formatmonth(2019, 1))
#     Januar 2019
# Mo Di Mi Do Fr Sa So
#     1  2  3  4  5  6
#  7  8  9 10 11 12 13
# 14 15 16 17 18 19 20
# 21 22 23 24 25 26 27
# 28 29 30 31
# 

calendar.LocaleTextCalendar a les méthodes suivantes. Les paramètres w et l peuvent être spécifiés pour un calendrier mensuel, et les paramètres supplémentaires c et m peuvent être spécifiés pour un calendrier annuel.

  • formatmonth() : renvoie une chaîne de calendrier mensuel
  • prmonth() : imprime un calendrier mensuel
  • formatyear() : renvoie une chaîne de calendrier annuel
  • pryear() : imprime un calendrier annuel

Notez que la largeur des caractères à deux octets n’est pas prise en compte.

ltc_ja = calendar.LocaleTextCalendar(locale='ja_jp')

print(ltc_ja.formatmonth(2019, 1))
#       1月 2019
# 月  火  水  木  金  土  日
#     1  2  3  4  5  6
#  7  8  9 10 11 12 13
# 14 15 16 17 18 19 20
# 21 22 23 24 25 26 27
# 28 29 30 31
# 

Obtenir/afficher les calendriers sous forme de tableau HTML

Vous pouvez obtenir le calendrier sous forme de tableau HTML en créant un objet calendar.HTMLCalendar et en appelant les différentes méthodes.

hc = calendar.HTMLCalendar()

Calendrier mensuel

Utilisez formatmonth() pour un calendrier mensuel. Vous pouvez spécifier si vous souhaitez afficher l’année dans l’en-tête avec le paramètre withyear (par défaut :True).

print(hc.formatmonth(2019, 1, withyear=False))
# <table border="0" cellpadding="0" cellspacing="0" class="month">
# <tr><th colspan="7" class="month">January</th></tr>
# <tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
# <tr><td class="noday">&nbsp;</td><td class="tue">1</td><td class="wed">2</td><td class="thu">3</td><td class="fri">4</td><td class="sat">5</td><td class="sun">6</td></tr>
# <tr><td class="mon">7</td><td class="tue">8</td><td class="wed">9</td><td class="thu">10</td><td class="fri">11</td><td class="sat">12</td><td class="sun">13</td></tr>
# <tr><td class="mon">14</td><td class="tue">15</td><td class="wed">16</td><td class="thu">17</td><td class="fri">18</td><td class="sat">19</td><td class="sun">20</td></tr>
# <tr><td class="mon">21</td><td class="tue">22</td><td class="wed">23</td><td class="thu">24</td><td class="fri">25</td><td class="sat">26</td><td class="sun">27</td></tr>
# <tr><td class="mon">28</td><td class="tue">29</td><td class="wed">30</td><td class="thu">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
# </table>
# 

print(type(hc.formatmonth(2019, 1)))
# <class 'str'>

Calendrier annuel

Utilisez formatyear() pour un calendrier annuel. Vous pouvez spécifier le nombre de mois à afficher par ligne avec le paramètre largeur (Par défaut :3).

La sortie est omise ici.

print(hc.formatyear(2019, width=4))

Définir les classes CSS

Comme vu dans les exemples précédents, les classes CSS sont définies pour chaque jour de la semaine.

Les noms de classe sont stockés sous forme de liste dans l’attribut cssclasses. Vous pouvez modifier les noms de classe en attribuant une nouvelle liste. Si vous appelez formatmonth() ou formatyear() après le changement, vous pouvez obtenir du HTML avec de nouveaux noms de classe.

print(hc.cssclasses)
# ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']

hc.cssclasses = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat blue', 'sun red']

Depuis Python 3.7, des attributs de classe CSS pour les mois, les années et les jours inexistants ont également été ajoutés. Ceux-ci peuvent également être remplacés par de nouvelles valeurs.

print(hc.cssclass_month)
# month

print(hc.cssclass_year)
# year

print(hc.cssclass_noday)
# noday

Définir le premier jour de la semaine

Vous pouvez spécifier le premier jour de la semaine avec le paramètre firstweekday de calendar.HTMLCalendar().

hc_sun = calendar.HTMLCalendar(firstweekday=6)

print(hc_sun.formatmonth(2019, 1))
# <table border="0" cellpadding="0" cellspacing="0" class="month">
# <tr><th colspan="7" class="month">January 2019</th></tr>
# <tr><th class="sun">Sun</th><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th></tr>
# <tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="tue">1</td><td class="wed">2</td><td class="thu">3</td><td class="fri">4</td><td class="sat">5</td></tr>
# <tr><td class="sun">6</td><td class="mon">7</td><td class="tue">8</td><td class="wed">9</td><td class="thu">10</td><td class="fri">11</td><td class="sat">12</td></tr>
# <tr><td class="sun">13</td><td class="mon">14</td><td class="tue">15</td><td class="wed">16</td><td class="thu">17</td><td class="fri">18</td><td class="sat">19</td></tr>
# <tr><td class="sun">20</td><td class="mon">21</td><td class="tue">22</td><td class="wed">23</td><td class="thu">24</td><td class="fri">25</td><td class="sat">26</td></tr>
# <tr><td class="sun">27</td><td class="mon">28</td><td class="tue">29</td><td class="wed">30</td><td class="thu">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
# </table>
# 

Notez que calendar.setfirstweekday() ne fonctionne pas.

Modifier les paramètres régionaux et les noms des jours de la semaine

Si vous souhaitez modifier les paramètres régionaux, créez un objet calendar.LocaleHTMLCalendar. Les mêmes méthodes sont fournies pour l’objet calendar.HTMLCalendar décrit ci-dessus.

lhc = calendar.LocaleHTMLCalendar(firstweekday=6, locale='ja_jp')

print(lhc.formatmonth(2019, 1))
# <table border="0" cellpadding="0" cellspacing="0" class="month">
# <tr><th colspan="7" class="month">1月 2019</th></tr>
# <tr><th class="sun">日</th><th class="mon">月</th><th class="tue">火</th><th class="wed">水</th><th class="thu">木</th><th class="fri">金</th><th class="sat">土</th></tr>
# <tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="tue">1</td><td class="wed">2</td><td class="thu">3</td><td class="fri">4</td><td class="sat">5</td></tr>
# <tr><td class="sun">6</td><td class="mon">7</td><td class="tue">8</td><td class="wed">9</td><td class="thu">10</td><td class="fri">11</td><td class="sat">12</td></tr>
# <tr><td class="sun">13</td><td class="mon">14</td><td class="tue">15</td><td class="wed">16</td><td class="thu">17</td><td class="fri">18</td><td class="sat">19</td></tr>
# <tr><td class="sun">20</td><td class="mon">21</td><td class="tue">22</td><td class="wed">23</td><td class="thu">24</td><td class="fri">25</td><td class="sat">26</td></tr>
# <tr><td class="sun">27</td><td class="mon">28</td><td class="tue">29</td><td class="wed">30</td><td class="thu">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
# </table>
# 

Obtenir des calendriers sous forme de liste

Liste des numéros

Vous pouvez obtenir un calendrier sous la forme d’une liste à deux dimensions (une liste de listes) dont les éléments sont des nombres entiers de dates avec calendar.monthcalendar(). Les jours qui n’existent pas sont mis à 0.

Cet exemple utilise pprint.

import calendar
import pprint

pprint.pprint(calendar.monthcalendar(2019, 1))
# [[0, 1, 2, 3, 4, 5, 6],
#  [7, 8, 9, 10, 11, 12, 13],
#  [14, 15, 16, 17, 18, 19, 20],
#  [21, 22, 23, 24, 25, 26, 27],
#  [28, 29, 30, 31, 0, 0, 0]]

Vous pouvez spécifier le premier jour de la semaine avec calendar.setfirstweekday().

calendar.setfirstweekday(6)

pprint.pprint(calendar.monthcalendar(2019, 1))
# [[0, 0, 1, 2, 3, 4, 5],
#  [6, 7, 8, 9, 10, 11, 12],
#  [13, 14, 15, 16, 17, 18, 19],
#  [20, 21, 22, 23, 24, 25, 26],
#  [27, 28, 29, 30, 31, 0, 0]]

Vous pouvez obtenir la même liste en créant un objet calendar.Calendar et en appelant la méthode monthdayscalendar(). Dans cette méthode, vous pouvez spécifier le premier jour de la semaine avec le paramètre firstweekday du constructeur calendar.Calendar().

c = calendar.Calendar(firstweekday=0)

pprint.pprint(c.monthdayscalendar(2019, 1))
# [[0, 1, 2, 3, 4, 5, 6],
#  [7, 8, 9, 10, 11, 12, 13],
#  [14, 15, 16, 17, 18, 19, 20],
#  [21, 22, 23, 24, 25, 26, 27],
#  [28, 29, 30, 31, 0, 0, 0]]

Vous pouvez obtenir le calendrier annuel avec la méthode yeardayscalendar() de l’objet calendar.Calendar. Comme pour le texte brut et HTML, vous pouvez spécifier le nombre de mois par ligne avec le paramètre width.

pprint.pprint(c.yeardayscalendar(2019), depth=2)
# [[[...], [...], [...]],
#  [[...], [...], [...]],
#  [[...], [...], [...]],
#  [[...], [...], [...]]]

pprint.pprint(c.yeardayscalendar(2019, width=4), depth=2)
# [[[...], [...], [...], [...]],
#  [[...], [...], [...], [...]],
#  [[...], [...], [...], [...]]]

Liste des tuples

Vous pouvez obtenir un calendrier sous forme de liste de tuples avec la méthode monthdays2calendar() de calendar.Calendar. Chaque tuple a une valeur de (date, jour) et une date inexistante est 0.

pprint.pprint(c.monthdays2calendar(2019, 1))
# [[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)],
#  [(7, 0), (8, 1), (9, 2), (10, 3), (11, 4), (12, 5), (13, 6)],
#  [(14, 0), (15, 1), (16, 2), (17, 3), (18, 4), (19, 5), (20, 6)],
#  [(21, 0), (22, 1), (23, 2), (24, 3), (25, 4), (26, 5), (27, 6)],
#  [(28, 0), (29, 1), (30, 2), (31, 3), (0, 4), (0, 5), (0, 6)]]

Utilisez yeardays2calendar() pour le calendrier annuel. Les exemples sont omis ici.

Liste de datetime.date

Vous pouvez obtenir un calendrier sous la forme d’une liste de datetime.date avec la méthode monthdatescalendar() de calendar.Calendar.

La première et la dernière semaine du mois incluent les dates des mois précédents et suivants.

pprint.pprint(c.monthdatescalendar(2019, 1))
# [[datetime.date(2018, 12, 31),
#   datetime.date(2019, 1, 1),
#   datetime.date(2019, 1, 2),
#   datetime.date(2019, 1, 3),
#   datetime.date(2019, 1, 4),
#   datetime.date(2019, 1, 5),
#   datetime.date(2019, 1, 6)],
#  [datetime.date(2019, 1, 7),
#   datetime.date(2019, 1, 8),
#   datetime.date(2019, 1, 9),
#   datetime.date(2019, 1, 10),
#   datetime.date(2019, 1, 11),
#   datetime.date(2019, 1, 12),
#   datetime.date(2019, 1, 13)],
#  [datetime.date(2019, 1, 14),
#   datetime.date(2019, 1, 15),
#   datetime.date(2019, 1, 16),
#   datetime.date(2019, 1, 17),
#   datetime.date(2019, 1, 18),
#   datetime.date(2019, 1, 19),
#   datetime.date(2019, 1, 20)],
#  [datetime.date(2019, 1, 21),
#   datetime.date(2019, 1, 22),
#   datetime.date(2019, 1, 23),
#   datetime.date(2019, 1, 24),
#   datetime.date(2019, 1, 25),
#   datetime.date(2019, 1, 26),
#   datetime.date(2019, 1, 27)],
#  [datetime.date(2019, 1, 28),
#   datetime.date(2019, 1, 29),
#   datetime.date(2019, 1, 30),
#   datetime.date(2019, 1, 31),
#   datetime.date(2019, 2, 1),
#   datetime.date(2019, 2, 2),
#   datetime.date(2019, 2, 3)]]

Utilisez yeardatescalendar() pour un calendrier annuel. Les exemples sont omis ici.

Sur la ligne de commande

Le module calendrier est également disponible en ligne de commande.

Appelez le calendrier en tant que module avec la commande python (ou python3 dans certains environnements) avec l’option -m.

python3 -m calendar 2019 1
#     January 2019
# Mo Tu We Th Fr Sa Su
#     1  2  3  4  5  6
#  7  8  9 10 11 12 13
# 14 15 16 17 18 19 20
# 21 22 23 24 25 26 27
# 28 29 30 31

Diverses options sont également disponibles.

python3 -m calendar -h
# usage: calendar.py [-h] [-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS]
#                    [-c CSS] [-L LOCALE] [-e ENCODING] [-t {text,html}]
#                    [year] [month]
# 
# positional arguments:
#   year                  year number (1-9999)
#   month                 month number (1-12, text only)
# 
# optional arguments:
#   -h, --help            show this help message and exit
#   -L LOCALE, --locale LOCALE
#                         locale to be used from month and weekday names
#   -e ENCODING, --encoding ENCODING
#                         encoding to use for output
#   -t {text,html}, --type {text,html}
#                         output type (text or html)
# 
# text only arguments:
#   -w WIDTH, --width WIDTH
#                         width of date column (default 2)
#   -l LINES, --lines LINES
#                         number of lines for each week (default 1)
#   -s SPACING, --spacing SPACING
#                         spacing between months (default 6)
#   -m MONTHS, --months MONTHS
#                         months per row (default 3)
# 
# html only arguments:
#   -c CSS, --css CSS     CSS to use for page