Python >> Tutoriel Python >  >> Python

Travailler avec iCalendar en Python

Dans mon article précédent sur Comment travailler avec les modules Calendar et Arrow Python, nous avons exploré comment utiliser les calendriers en Python. Mais qu'en est-il des fichiers iCal ? Dans cet article, nous verrons comment travailler avec iCalendar en Python, écrire et lire des fichiers iCal et analyser un calendrier à partir d'une URL telle que Google Calendar.

Mais d'abord, qu'est-ce qu'un fichier iCal ?

L'iCalendar (spécification de l'objet de base de l'agenda et de la planification Internet ) permet aux utilisateurs de stocker et d'échanger des informations de calendrier et de planification telles que des événements et des tâches. De nombreux produits, dont Google Agenda et Apple Agenda, utilisent ce format.

Jetons un coup d'œil à deux modules Python populaires qui simplifient le travail avec les fichiers .ics.

Comment lire et écrire des fichiers iCalendar en Python :le module iCalendar

icalendar est une bibliothèque populaire et pratique pour le traitement des calendriers en Python. Vous devez l'installer à partir du pip paquet :

pip install icalendar

Jetez un œil à sa documentation ici.

Ensuite, écrivons le code pour créer un nouvel événement et stockons-le sur le disque.

Nous commençons par les importations. En plus de icalendar , nous avons besoin de datetime , pytz , et pathlib . Vous pouvez lire les détails de ces forfaits ici et ici.

# imports
from icalendar import Calendar, Event, vCalAddress, vText
from datetime import datetime
from pathlib import Path
import os
import pytz

# init the calendar
cal = Calendar()

iCalendar suit les spécifications RFC5545, ce qui signifie que nous devons inclure certaines propriétés telles que PRODID et Version. PRODID spécifie l'identifiant qui a créé l'objet iCalendar.

# Some properties are required to be compliant
cal.add('prodid', '-//My calendar product//example.com//')
cal.add('version', '2.0')

Ensuite, nous ajoutons l'événement avec un nom, une description, un début et une fin.

# Add subcomponents
event = Event()
event.add('name', 'Awesome Meeting')
event.add('description', 'Define the roadmap of our awesome project')
event.add('dtstart', datetime(2022, 1, 25, 8, 0, 0, tzinfo=pytz.utc))
event.add('dtend', datetime(2022, 1, 25, 10, 0, 0, tzinfo=pytz.utc))

# Add the organizer
organizer = vCalAddress('MAILTO:[email protected]')

# Add parameters of the event
organizer.params['name'] = vText('John Doe')
organizer.params['role'] = vText('CEO')
event['organizer'] = organizer
event['location'] = vText('New York, USA')

event['uid'] = '2022125T111010/[email protected]'
event.add('priority', 5)
attendee = vCalAddress('MAILTO:[email protected]')
attendee.params['name'] = vText('Richard Roe')
attendee.params['role'] = vText('REQ-PARTICIPANT')
event.add('attendee', attendee, encode=0)

attendee = vCalAddress('MAILTO:[email protected]')
attendee.params['name'] = vText('John Smith')
attendee.params['role'] = vText('REQ-PARTICIPANT')
event.add('attendee', attendee, encode=0)

# Add the event to the calendar
cal.add_component(event)

Enfin, nous stockons l'événement sur le disque en tant que example.ics . Nous créons un répertoire appelé MyCalendar avec pathlib , puis nous écrivons l'événement dans un fichier. Vous pouvez lire l'un de mes articles précédents ici pour en savoir plus sur l'écriture dans un fichier en Python.

# Write to disk
directory = Path.cwd() / 'MyCalendar'
try:
   directory.mkdir(parents=True, exist_ok=False)
except FileExistsError:
   print("Folder already exists")
else:
   print("Folder was created")

f = open(os.path.join(directory, 'example.ics'), 'wb')
f.write(cal.to_ical())
f.close()

Maintenant que nous avons créé un événement, lisons-le.

e = open('MyCalendar/example.ics', 'rb')
ecal = icalendar.Calendar.from_ical(e.read())
for component in ecal.walk():
   print(component.name)
e.close()

La sortie affiche deux composants :

VCALENDAR
VEVENT

Les événements sont stockés dans VEVENT . Pour obtenir les détails, nous devons accéder à ses sous-composants. Notez que vous devez appeler le decoded() méthode au lieu de get() pour afficher les valeurs de date et d'heure.

e = open('MyCalendar/example.ics', 'rb')
ecal = icalendar.Calendar.from_ical(e.read())
for component in ecal.walk():
   if component.name == "VEVENT":
       print(component.get("name"))
       print(component.get("description"))
       print(component.get("organizer"))
       print(component.get("location"))
       print(component.decoded("dtstart"))
       print(component.decoded("dtend"))
e.close()

Et voici le résultat :

Awesome Meeting
Define the roadmap of our awesome project
MAILTO:[email protected]
New York, USA
2022-01-25 08:00:00+00:00
2022-01-25 10:00:00+00:00

Voilà! Nous savons comment créer un fichier iCal et le lire. Reportez-vous à la documentation iCalendar pour en savoir plus sur le package.

Découvrons maintenant comment traiter un calendrier en Python.

Analyser un agenda Google à partir d'une URL :le module ics

Nous pouvons également analyser une URL Google Calendar. Pour cet exemple, nous utilisons le ics.py package, que vous pouvez installer avec la commande suivante :

pip install ics

Utilisons un calendrier Google public sur les phases de la Lune, analysons-le comme un fichier iCal et extrayons les événements.

from ics import Calendar
import requests

# Parse the URL
url = "https://calendar.google.com/calendar/ical/ht3jlfaac5lfd6263ulfh4tql8%40group.calendar.google.com/public/basic.ics"
cal = Calendar(requests.get(url).text)

# Print all the events
print(cal.events)

Et voici une partie du résultat :

{,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,...}

Vous voulez l'imprimer joliment ? Jetez un œil à deux modules populaires pour les jolies tables d'impression ici.

Trions les événements par ordre décroissant en utilisant sorted() . Nous utilisons sorted() au lieu de fsort() car la variable events est un ensemble, alors que sort() fonctionne avec des listes.

events = cal.events
sorted_events = sorted(events, reverse = True)
sorted_events

Voici une partie du résultat :

[,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,...]

Vous pouvez obtenir des détails supplémentaires sur sort() , sorted() , et plus dans mon article sur l'utilisation des flux en Python. N'hésitez pas à réutiliser ces extraits de code et à explorer le ics.py documentation ici.

Le ics module peut également créer des fichiers iCalendar. Supposons que vous souhaitiez ajouter des événements à votre calendrier de travail pour réserver du temps chaque jour pour vos tâches. Vous voulez 2 heures par jour, et 1 heure de plus serait agréable à avoir. Vous pouvez le faire avec le code suivant :

import arrow
from ics import Calendar, Event

calendar = Calendar()

tz = 'Europe/Paris'
first_day = arrow.get("2022-02-14").replace(tzinfo=tz)
last_day = arrow.get("2022-02-18").replace(tzinfo=tz)

for day in arrow.Arrow.range('day', first_day, last_day):
    event = Event()
    event.name = "Working on the task"
    event.begin = day.replace(hour=8).to('utc').datetime
    event.end = day.replace(hour=10).to('utc').datetime
    event.transparent = False
    calendar.events.add(event)

    event = Event()
    event.name = "Continue on the task?"
    event.begin = day.replace(hour=10).to('utc').datetime
    event.end = day.replace(hour=11).to('utc').datetime
    event.transparent = True
    calendar.events.add(event)

print(calendar) # you can simply save this to a file

Assez simple, non? Vous n'avez pas à vous soucier des ID d'événement ou des autres attributs de fichier iCalendar requis. La valeur transparente définit votre disponibilité. True signifie "transparent" (c'est-à-dire "gratuit"), et False signifie "opaque" (c'est-à-dire "occupé"). Ce n'est peut-être pas évident, mais pensez-y de cette façon :il doit afficher ou bloquer l'heure en fonction de votre disponibilité lorsque vous recherchez des heures de disponibilité sur votre calendrier.

Faites également attention aux fuseaux horaires. Le ics module fonctionne avec les valeurs UTC, et vous souhaitez définir les vôtres avant la conversion.

Il ne vous reste plus qu'à vous rendre dans les paramètres de votre agenda Google et importer le fichier ics. Vous voudrez peut-être le tester sur un calendrier de test distinct avant de l'ajouter à votre calendrier principal, car il n'existe pas de moyen simple de supprimer des événements en masse.

Si vous souhaitez en savoir plus sur la manipulation de données et la programmation avec Python, je vous encourage à rejoindre notre piste de programmation Python.

Travailler avec iCalendar en Python et plus !

Nous avons examiné comment travailler avec les fichiers iCalendar en Python dans cet article. Nous avons découvert comment créer un événement, le stocker sous forme de fichier iCal et le lire. Nous avons également appris à traiter un calendrier à partir d'une URL et à extraire les événements d'un calendrier Google public.

Maintenant, il est temps pour vous de jouer avec le code pour solidifier vos connaissances. Vous pouvez également lire sur les bonnes pratiques Python dans mon article ici pour améliorer vos compétences.

Et apprenez-en plus sur Python sur LearnPython.com !