Модуль календаря 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
В вашем календаре теперь отображаются сокращения месяца и дня недели на основе их немецкого написания.
Примечание. Коды локали различаются в зависимости от операционной системы, как описано в документации модуля Python locale
.