Das Python-Kalendermodul: Erstellen Sie Kalender mit Python


Das Python-Modul calendar bietet verschiedene Möglichkeiten zum Generieren von Kalendern für Python-Programme. Es enthält außerdem eine Vielzahl von Funktionen zum Arbeiten mit Kalenderdaten als Zeichenfolgen, Zahlen und Datum/Uhrzeit-Objekte.

In diesem Tutorial erfahren Sie, wie Sie mit dem Modul calendar Kalender mit Python erstellen und anpassen.

Am Ende dieses Tutorials werden Sie in der Lage sein:

  • Zeigen Sie Kalender in Ihrem Terminal mit Python an
  • Erstellen Sie Nur-Text- und HTML-Kalender
  • Formatieren Sie Kalender für bestimmte Orte und Anzeigekonventionen
  • Verwenden Sie kalenderbezogene Funktionen und Methoden, um auf Kalenderdaten auf niedrigerer Ebene in verschiedenen Formaten zuzugreifen

Kalender in Ihrem Terminal anzeigen

Unix und Unix-ähnliche Betriebssysteme wie macOS und Linux enthalten ein cal-Befehlszeilendienstprogramm zum Anzeigen von Kalendern in einer interaktiven Konsole:

$ cal
      May 2024        
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     

Python bietet ein ähnliches Tool, mit dem Sie das Modul calendar als Befehlszeilenskript ausführen können. Um mit der Erkundung des Python-Moduls calendar zu beginnen, öffnen Sie Ihr Terminalprogramm und geben Sie den folgenden Befehl ein:

$ python -m calendar
                                  2024

      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  7                1  2  3  4                   1  2  3
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       4  5  6  7  8  9 10
15 16 17 18 19 20 21      12 13 14 15 16 17 18      11 12 13 14 15 16 17
22 23 24 25 26 27 28      19 20 21 22 23 24 25      18 19 20 21 22 23 24
29 30 31                  26 27 28 29               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

Wenn Sie python -m Calendar ohne Argumente ausführen, wird ein vollständiger Jahreskalender für das aktuelle Jahr ausgegeben. Um den vollständigen Kalender für ein anderes Jahr anzuzeigen, übergeben Sie die Ganzzahldarstellung eines Jahres als erstes Argument des Befehls calendar:

$ python -m calendar 1989

Um einen einzelnen Monat anzuzeigen, übergeben Sie als zweiten Parameter sowohl ein Jahr als auch einen Monat:

$ python -m calendar 2054 07
     July 2054
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

Wie Sie in diesen Beispielen sehen können, kann das Modul calendar Kalender sowohl für vergangene als auch für zukünftige Daten anzeigen. Der offiziellen Dokumentation zufolge verwendet das Modul calendar den aktuellen gregorianischen Kalender, der in beide Richtungen unbegrenzt erweitert wird. Es verwendet außerdem den ISO 8601-Standard, einen internationalen Standard für den Austausch und die Kommunikation von datums- und zeitbezogenen Daten.

Nachdem Sie nun wissen, wie Sie mit Python Kalender in Ihrem Terminal anzeigen, können Sie weitere Ansätze zum Erstellen von Kalendern als Nur-Text- oder HTML-Markup-Darstellungen erkunden.

Erstellen textbasierter Kalender

Um Nur-Text-Kalender zu generieren, stellt das Modul calendar calendar.TextCalendar Methoden zum Formatieren und Drucken von Monats- und Jahreskalendern zur Verfügung.

TextCalendar.formatyear() akzeptiert einen einzelnen Parameter für das Jahr, wie das Befehlszeilenskript calendar. Probieren Sie es in Ihrer Python-REPL aus, indem Sie den folgenden Code ausführen:

>>> import calendar
>>> text_calendar = calendar.TextCalendar()
>>> text_calendar.formatyear(2024)
'                                  2024\n\n      January    (...)'

Hier rufen Sie nach der Instanziierung einer text_calendar-Instanz von calendar.TextCalendar .formatyear(2024) auf, was den vollständigen Kalender für 2024 als zurückgibt mehrzeilige Zeichenfolge. Mit TextCalendar.pryear() können Sie das schöner gestalten, wodurch der Jahreskalender in einem besser lesbaren Format gedruckt wird:

>>> text_calendar.pryear(2024)
                                  2024

      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  7                1  2  3  4                   1  2  3
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       4  5  6  7  8  9 10
15 16 17 18 19 20 21      12 13 14 15 16 17 18      11 12 13 14 15 16 17
22 23 24 25 26 27 28      19 20 21 22 23 24 25      18 19 20 21 22 23 24
29 30 31                  26 27 28 29               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

Wie Sie sehen, benötigt .pryear() das Jahr als erstes Argument. Es bietet außerdem einige optionale Parameter zum Formatieren der Anzeigeeigenschaften des Kalenders, die wie folgt aussehen: .pryear(theyear, w=2, l=1, c=6, m=3).

Der Parameter w legt die Breite der Datumsspalte fest, l ist die Anzahl der Zeilen pro Woche, c legt den Abstand zwischen Monatsspalten fest und m ist die Anzahl der Monatsspalten.

Um einen Kalender für einen einzelnen Monat als Klartext zu formatieren und zu drucken, stellt TextCalendar die ähnlichen Formate .formatmonth() und .prmonth() bereit zu den Jahreskalendermethoden. Die Methode .prmonth() enthält einen zweiten erforderlichen Parameter für den Monat als Ganzzahl sowie zwei optionale Parameter: w für die Breite der Datumsspalten und l für die Anzahl der Zeilen, die jede Woche verwendet wird. Beide optionalen Parameter sind standardmäßig auf Null gesetzt.

Arbeiten Sie in derselben Konsolensitzung wie zuvor und verwenden Sie TextCalendar.prmonth(), um einen Nur-Text-Kalender für einen einzelnen Monat wie folgt zu generieren und zu drucken:

>>> text_calendar.prmonth(2024, 1)
    January 2024
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

Nachdem Sie nun die Grundlagen der Erstellung von Kalendern im Klartext verstanden haben, können Sie noch einen Schritt weiter gehen und lernen, wie Sie mit Python HTML-Kalender für die Anzeige im Web generieren.

Generieren und Gestalten von HTML-Kalendern

Wenn Sie einen Kalender für eine Website erstellen müssen, kann das Modul calendar mit calendar.HTMLCalendar auch Kalender in HTML ausgeben. Seine Methoden .formatmonth() und .formatyear() funktionieren wie ihre entsprechenden TextCalendar-Methoden. Sie ersetzen jedoch die Formatierungsparameter durch die Möglichkeit, CSS-Klassen für die Gestaltung von HTML zu generieren.

Um diese Klasse zu verwenden, erstellen Sie eine html_calendar-Instanz in Ihrer Python-Konsole und testen Sie sie, indem Sie .formatyear() aufrufen:

>>> import calendar
>>> html_calendar = calendar.HTMLCalendar()
>>> html_calendar.formatyear(2024)
'<table border="0" cellpadding="0" cellspacing="0" class="year">\n<tr> (...)'

Dadurch wird eine lange Python-Zeichenfolge mit HTML-Markup zurückgegeben, die einen Kalender für das gesamte Jahr als HTML-Tabelle darstellt. Um diesen HTML-Kalender in einem Webbrowser anzuzeigen, verwenden Sie zunächst die Python-Funktion print(), um die Zeichenfolge als HTML in Ihrer Konsole auszugeben:

>>> print(html_calendar.formatyear(2024))

Kopieren Sie nun die Ausgabe dieses Befehls und fügen Sie sie in eine neue Datei mit dem Namen formatyear.html ein. Öffnen Sie diese Datei mit dem Webbrowser Ihres Computers. Sie sollte etwa so aussehen:

Wie Sie sehen, sind nicht formatierte HTML-Tabellen nicht gerade die benutzerfreundlichste Art, einen Kalender anzuzeigen und zu lesen. Glücklicherweise können Sie mit HTMLCalendar.formatyearpage() ein CSS-Stylesheet einbinden, indem Sie einen Jahreskalender als vollständige HTML-Seite generieren. Der optionale css-Parameter dieser Methode hat standardmäßig den Wert 'calendar.css' und bezieht sich auf den Namen der CSS-Datei, die die benutzerdefinierten Stile enthält.

Um eine neue Datei zu erstellen, die eine vollständige HTML-Seite enthält, die von .formatyearpage() generiert wurde, verwenden Sie die in Python integrierte Funktion open(). Übergeben Sie dann 'wb' als zweites Argument nach dem Dateinamen, um im Binärmodus in die Datei zu schreiben:

>>> with open("formatyearpage.html", mode="wb") as file:
...     file.write(html_calendar.formatyearpage(2024))
...

Hier verwenden Sie die Python-Anweisung with, um Ihre Datei zu öffnen und erstellen ein Kontextmanagerobjekt, um sicherzustellen, dass die Datei immer geschlossen wird, auch wenn eine Ausnahme im with-Block ausgelöst wird. Es ist wichtig, von Python geöffnete Dateien immer zu schließen, um Betriebssystemressourcen zu schonen und die Dateien vor Datenverlust zu schützen.

Jetzt sollten Sie eine neue Datei mit dem Namen formatyearpage.html in dem Ordner sehen, in dem Sie Ihre Python-Konsole geöffnet haben. Öffnen Sie diese Datei und Sie sehen das Markup für eine vollständige HTML-Seite mit diesem <link>-Tag:

<link rel="stylesheet" type="text/css" href="calendar.css" />

Erstellen Sie eine neue Datei mit dem Namen calendar.css im selben Verzeichnis wie die Datei formatyearpage.html und fügen Sie den folgenden CSS-Code hinzu:

body {
    font: 16px "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;
}

table {
    margin: 10px;
}

th, td {
    padding: 5px;
}

Jetzt können Sie formatyearpage.html mit Ihrem Webbrowser öffnen, um zu sehen, wie Sie Ihren Kalender etwas lesbarer gemacht haben. Sie haben einige Abstände um die Datumszeilen und -spalten herum hinzugefügt, die Ränder der Monatstabellen vergrößert und die Schriftarteigenschaft des HTML-Textkörpers aktualisiert:

Zusätzlich zu den Methoden, die Sie zum Erstellen von Nur-Text- und HTML-Kalendern kennengelernt haben, können Sie mit dem calendar-Modul auch Kalender für verschiedene globale Standorte erstellen, die Sie als Nächstes erkunden werden.

Formatieren von Kalendern für bestimmte Orte

Standardmäßig folgen alle vom Modul calendar generierten Kalender der europäischen Konvention, Montag als ersten Tag der Woche zu verwenden. Sie können dies mit Calendar.setfirstweekday() ändern, das als Instanzmethode für TextCalendar und HTMLCalendar verfügbar ist.

Das calendar-Modul verwendet Ganzzahlen zur Darstellung von Wochentagen, wobei Null Montag und Sechs Sonntag ist, oder es verwendet Konstanten wie calendar.MONDAY, das für definiert ist Lesbarkeit.

Um den ersten Tag der Woche für einen Nur-Text-Kalender von Montag auf Sonntag zu ändern, führen Sie den folgenden Code in Ihrer Python-Konsole aus:

>>> import calendar
>>> text_calendar = calendar.TextCalendar()
>>> text_calendar.prmonth(2024, 1)
    January 2024
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
>>> text_calendar.setfirstweekday(calendar.SUNDAY)
>>> text_calendar.prmonth(2024, 1)
    January 2024
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

Darüber hinaus stellt das Modul calendar ortsspezifische Unterklassen von TextCalendar und HTMLCalendar bereit, die die Monats- und Wochentagsnamen für ein bestimmtes Gebietsschema anzeigen. Unten sehen Sie ein Beispiel dafür, wie es aussehen würde, wenn Sie calendar.LocaleTextCalendar verwenden würden, um einen Kalender für das Gebietsschema Deutschland mit UTF-8-Kodierung auszugeben:

>>> locale_calendar = calendar.LocaleTextCalendar(locale="de_DE.UTF-8")
>>> locale_calendar.prmonth(2024, 1)
    Januar 2024
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

Ihr Kalender zeigt nun die Abkürzungen für Monat und Wochentag in der deutschen Schreibweise an.