Поиск по сайту:

Модуль календаря Python: создание календарей с помощью Python


Модуль Python calendar предоставляет несколько способов создания календарей для программ Python. Он также включает в себя множество функций для работы с данными календаря в виде строк, чисел и объектов даты и времени.

В этом уроке вы узнаете, как использовать модуль calendar для создания и настройки календарей с помощью Python.

К концу этого руководства вы сможете:

  • Отображение календарей в вашем терминале с помощью Python
  • Создавайте календари в формате обычного текста и HTML.
  • Форматирование календарей в соответствии с региональными стандартами и правилами отображения.
  • Используйте функции и методы, связанные с календарем, для доступа к данным календаря нижнего уровня в различных форматах.

Отображение календарей в вашем терминале

Unix и Unix-подобные операционные системы, такие как macOS и Linux, включают в себя утилиту командной строки cal для отображения календарей в интерактивной консоли:

$ 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 предоставляет аналогичный инструмент, который позволяет запускать модуль calendar как скрипт командной строки. Чтобы начать изучение модуля Python calendar, откройте терминальную программу и введите следующую команду:

$ 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

Запуск python -m Calendar без аргументов выводит полный календарь текущего года. Чтобы отобразить полный календарь для другого года, передайте целочисленное представление года в качестве первого аргумента команды calendar:

$ python -m calendar 1989

Чтобы просмотреть один месяц, передайте год и месяц в качестве второго параметра:

$ 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

Как вы можете видеть в этих примерах, модуль calendar может отображать календари как для прошлых, так и для будущих дат. Согласно официальной документации, модуль calendar использует текущий григорианский календарь, неограниченно расширенный в обе стороны. Он также использует стандарт ISO 8601, который является международным стандартом для обмена и передачи данных, связанных с датой и временем.

Теперь, когда вы знаете, как отображать календари в терминале с помощью Python, вы можете двигаться дальше и исследовать другие подходы к созданию календарей в виде обычного текста или представления разметки HTML.

Создание текстовых календарей

Для создания календарей в виде простого текста модуль calendar предоставляет calendar.TextCalendar методы для форматирования и печати ежемесячных и годовых календарей.

TextCalendar.formatyear() принимает один параметр для года, как и сценарий командной строки calendar. Попробуйте это в своем Python REPL, выполнив следующий код:

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

Здесь после создания экземпляра text_calendar calendar.TextCalendar вы вызываете .formatyear(2024), который возвращает полный календарь на 2024 год в виде многострочная строка. Вы можете сделать это лучше с помощью TextCalendar.pryear(), который печатает календарь на год в более читаемом формате:

>>> 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

Как видите, .pryear() требует год в качестве первого аргумента. Он также предоставляет некоторые дополнительные параметры для форматирования свойств отображения календаря, которые выглядят следующим образом: .pryear(theyear, w=2, l=1, c=6, m=3).

Параметр w задает ширину столбца даты, l — количество строк в неделю, c задает интервал между столбцами месяца, а m — количество столбцов месяца.

Чтобы отформатировать и распечатать календарь на один месяц в виде обычного текста, TextCalendar предоставляет .formatmonth() и .prmonth(), которые аналогичны к методам годового календаря. Метод .prmonth() включает второй обязательный параметр для месяца в виде целого числа, а также два дополнительных параметра: w для ширины столбцов даты и l — количество строк, которые будут использоваться каждую неделю. Оба этих необязательных параметра по умолчанию равны нулю.

Работая в том же сеансе консоли, что и раньше, используйте TextCalendar.prmonth(), чтобы сгенерировать и распечатать простой текстовый календарь на один месяц, например:

>>> 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

Теперь, когда вы понимаете основы создания календарей в виде обычного текста, вы можете пойти дальше и научиться создавать HTML-календари с помощью Python для отображения в Интернете.

Создание и оформление HTML-календарей

Если вам нужно создать календарь для веб-сайта, модуль calendar также может выводить календари в формате HTML с помощью calendar.HTMLCalendar. Его методы .formatmonth() и .formatyear() работают так же, как соответствующие им методы TextCalendar. Но они заменяют параметры форматирования возможностью генерировать классы CSS для стилизации HTML.

Чтобы использовать этот класс, создайте экземпляр html_calendar в консоли Python и протестируйте его, вызвав .formatyear():

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

Это вернет длинную строку HTML-разметки Python, представляющую календарь на весь год в виде таблицы HTML. Чтобы просмотреть этот HTML-календарь в веб-браузере, сначала используйте функцию Python print() для вывода строки в виде HTML в консоль:

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

Теперь скопируйте вывод этой команды и вставьте его в новый файл с именем formatyear.html. Откройте этот файл в веб-браузере вашего компьютера, и он должен выглядеть примерно так:

Как видите, HTML-таблицы без стилей — не самый удобный способ отображения и чтения календаря. К счастью, HTMLCalendar.formatyearpage() позволяет вам включить таблицу стилей CSS, создав годовой календарь в виде полноценной HTML-страницы. Необязательный параметр css этого метода по умолчанию имеет значение 'calendar.css', что указывает на имя файла CSS, который будет включать пользовательские стили.

Чтобы создать новый файл, содержащий полную HTML-страницу, сгенерированную с помощью .formatyearpage(), используйте встроенную функцию Python open(). Затем передайте 'wb' в качестве второго аргумента после имени файла для записи в файл в двоичном режиме:

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

Здесь вы используете оператор Python with, чтобы открыть файл, создавая объект диспетчера контекста, который гарантирует, что файл всегда будет закрыт, даже если в блоке with выдается исключение. Важно всегда закрывать файлы, открытые Python, чтобы сохранить ресурсы операционной системы и защитить файлы от потери данных.

Теперь вы должны увидеть новый файл с именем formatyearpage.html в папке, в которой вы открыли консоль Python. Откройте этот файл, и вы увидите разметку полной HTML-страницы, включая тег <link>:

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

Создайте новый файл с именем calendar.css в том же каталоге, что и файл formatyearpage.html, и добавьте следующий код CSS:

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

table {
    margin: 10px;
}

th, td {
    padding: 5px;
}

Теперь вы можете открыть formatyearpage.html в веб-браузере и увидеть, как вы сделали свой календарь более читабельным. Вы добавили отступы вокруг строк и столбцов даты, увеличили поля таблиц месяцев и обновили свойство шрифта тела HTML:

В дополнение к методам создания обычных текстовых и HTML-календарей, которые вы изучили, модуль calendar также позволяет создавать календари для различных глобальных местоположений, которые вы изучите далее.

Форматирование календарей для определенных мест

По умолчанию все календари, созданные модулем calendar, соответствуют европейскому соглашению, согласно которому понедельник используется в качестве первого дня недели. Вы можете изменить это с помощью Calendar.setfirstweekday(), который доступен как метод экземпляра для TextCalendar и HTMLCalendar.

Модуль calendar использует целые числа для обозначения дней недели, где ноль — это понедельник, а шесть — воскресенье, или он использует константы, такие как calendar.MONDAY, которые определены для читабельность.

Чтобы изменить первый день недели с понедельника на воскресенье для обычного текстового календаря, выполните следующий код в консоли Python:

>>> 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

Кроме того, модуль calendar предоставляет подклассы TextCalendar и HTMLCalendar, зависящие от местоположения, которые отображают названия месяца и дня недели для определенного языкового стандарта. Ниже приведен пример того, как это будет выглядеть, если вы используете calendar.LocaleTextCalendar для вывода календаря для языкового стандарта Германии с использованием кодировки UTF-8:

>>> 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

В вашем календаре теперь отображаются сокращения месяца и дня недели на основе их немецкого написания.