Skip to main content

iCalendar parser/generator

Project description

The icalendar package is a RFC 5545 compatible parser/generator for iCalendar files.


Homepage:

https://icalendar.readthedocs.io

Code:

https://github.com/collective/icalendar

Mailing list:

https://github.com/collective/icalendar/issues

Dependencies:

python-dateutil and tzdata.

License:

BSD


Python Package Version on PyPI PyPI - Python Version Downloads from PyPI GitHub Actions build status for main Documentation Status Test Coverage

Quick start guide

icalendar enables you to create, inspect and modify calendaring information with Python.

To install the package, run:

pip install icalendar

Inspect Files

You can open an .ics file and see all the events:

>>> import icalendar
>>> from pathlib import Path
>>> ics_path = Path("src/icalendar/tests/calendars/example.ics")
>>> with ics_path.open() as f:
...     calendar = icalendar.Calendar.from_ical(f.read())
>>> for event in calendar.walk('VEVENT'):
...     print(event.get("SUMMARY"))
New Year's Day
Orthodox Christmas
International Women's Day

Modify Content

Such a calendar can then be edited and saved again.

>>> calendar["X-WR-CALNAME"] = "My Modified Calendar"  # modify
>>> print(calendar.to_ical()[:129])  # save modification
BEGIN:VCALENDAR
VERSION:2.0
PRODID:collective/icalendar
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:My Modified Calendar

Create Events, TODOs, Journals, Alarms, …

icalendar supports the creation and parsing of all kinds of objects in the iCalendar (RFC 5545) standard.

>>> icalendar.Event()  # events
VEVENT({})
>>> icalendar.FreeBusy()  # free/busy times
VFREEBUSY({})
>>> icalendar.Todo()  # Todo list entries
VTODO({})
>>> icalendar.Alarm()  # Alarms e.g. for events
VALARM({})
>>> icalendar.Journal()   # Journal entries
VJOURNAL({})

Have a look at more examples.

Use timezones of your choice

With icalendar, you can localize your events to take place in different timezones. zoneinfo, dateutil.tz and pytz are compatible with icalendar. This example creates an event that uses all of the timezone implementations with the same result:

>>> import pytz, zoneinfo, dateutil.tz  # timezone libraries
>>> import datetime, icalendar
>>> e = icalendar.Event()
>>> tz = dateutil.tz.tzstr("Europe/London")
>>> e["X-DT-DATEUTIL"] = icalendar.vDatetime(datetime.datetime(2024, 6, 19, 10, 1, tzinfo=tz))
>>> tz = pytz.timezone("Europe/London")
>>> e["X-DT-USE-PYTZ"] = icalendar.vDatetime(datetime.datetime(2024, 6, 19, 10, 1, tzinfo=tz))
>>> tz = zoneinfo.ZoneInfo("Europe/London")
>>> e["X-DT-ZONEINFO"] = icalendar.vDatetime(datetime.datetime(2024, 6, 19, 10, 1, tzinfo=tz))
>>> print(e.to_ical())  # the libraries yield the same result
BEGIN:VEVENT
X-DT-DATEUTIL;TZID=Europe/London:20240619T100100
X-DT-USE-PYTZ;TZID=Europe/London:20240619T100100
X-DT-ZONEINFO;TZID=Europe/London:20240619T100100
END:VEVENT

Version 6 with zoneinfo

Version 6 of icalendar switches the timezone implementation to zoneinfo. This only affects you if you parse icalendar objects with from_ical(). The functionality is extended and is tested since 6.0.0 with both timezone implementations pytz and zoneinfo.

By default and since 6.0.0, zoneinfo timezones are created.

>>> dt = icalendar.Calendar.example("timezoned").walk("VEVENT")[0]["DTSTART"].dt
>>> dt.tzinfo
ZoneInfo(key='Europe/Vienna')

If you would like to continue to receive pytz timezones in parse results, you can receive all the latest updates, and switch back to earlier behavior:

>>> icalendar.use_pytz()
>>> dt = icalendar.Calendar.example("timezoned").walk("VEVENT")[0]["DTSTART"].dt
>>> dt.tzinfo
<DstTzInfo 'Europe/Vienna' CET+1:00:00 STD>

Version 6 is on branch main. It is compatible with Python versions 3.8 - 3.13, and PyPy3. We expect the main branch with versions 6+ to receive the latest updates and features.

Further Reading

You can find out more about this project:

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

icalendar-6.1.0.tar.gz (142.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

icalendar-6.1.0-py3-none-any.whl (198.6 kB view details)

Uploaded Python 3

File details

Details for the file icalendar-6.1.0.tar.gz.

File metadata

  • Download URL: icalendar-6.1.0.tar.gz
  • Upload date:
  • Size: 142.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.13.0

File hashes

Hashes for icalendar-6.1.0.tar.gz
Algorithm Hash digest
SHA256 43c2db8632959d634f4e48f6e6131e706bf2cdddad488cf0b72fda079b796bad
MD5 97c8d7733bd5c6421e4b55711cd07466
BLAKE2b-256 0344c9fdf8f6442e5bef2635f25dbb3d3ac12d5f2ecf5223bd94acaba51ceda4

See more details on using hashes here.

File details

Details for the file icalendar-6.1.0-py3-none-any.whl.

File metadata

  • Download URL: icalendar-6.1.0-py3-none-any.whl
  • Upload date:
  • Size: 198.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.13.0

File hashes

Hashes for icalendar-6.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 46c09b774a6e6948495dafcb166dc15135c8259d0ae25491f154cbc822714b69
MD5 91e070544c6d81b369cbef7ccab78fbf
BLAKE2b-256 a5b5276bf1e5d0433144b27f707c40afe79e7e8863806837f42956053840a078

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page