iCalendarはカレンダーアプリなどで使われるスケジュールデータの標準フォーマット。
iCalendarファイルを使ってGoogleカレンダーやOutlookなどのアプリにスケジュールをインポートすることもできる。

iCalendarファイルは単純なテキストファイルなので、その気になれば一行一行書き出す処理を書いて作ることもできそう。

PythonでiCalendarファイルを読み書きできるライブラリがあるのでこれを使ってみる。

Python icalendar (rfc5545) parser

クイックスタートを見ながら試してみる。

まずはファイルの書き出しから。

ics_write.py

from ics import Calendar, Event
import arrow

# カレンダーの生成
cal = Calendar()
cal.creator = 'Me' # 作成者

# イベントの生成
event1 = Event()
event1.name = "A社と打ち合わせ" # タイトル
event1.begin = arrow.get("2021-11-08 12:00:00" ,"YYYY-MM-DD HH:mm:ss").replace(tzinfo="Asia/Tokyo") # 開始
event1.end = arrow.get("2021-11-08 13:00:00" ,"YYYY-MM-DD HH:mm:ss").replace(tzinfo="Asia/Tokyo") # 終了
event1.description = '○○について\n××について' # 説明
cal.events.add(event1) # カレンダーにイベント追加

event2 = Event()
event2.name = "有給休暇"
event2.begin = arrow.get("2021-11-10 00:00:01" ,"YYYY-MM-DD HH:mm:ss").replace(tzinfo="Asia/Tokyo")
event2.end = arrow.get("2021-11-11 23:59:59" ,"YYYY-MM-DD HH:mm:ss").replace(tzinfo="Asia/Tokyo")
cal.events.add(event2)

print(cal.events)

with open('my.ics', 'w', encoding='utf-8') as f:
    f.write(str(cal))

注意点としてそのまま日時をセットするとUTCで扱われるのでタイムゾーンを指定している。

python ics_write.py
{<Event '有給休暇' begin:2021-11-10T00:00:01+09:00 end:2021-11-11T23:59:59+09:00>, <Event 'A社と打ち合わせ' begin:2021-11-08T12:00:00+09:00 end:2021-11-08T13:00:00+09:00>}

出力されたファイル。

my.ics

BEGIN:VCALENDAR

VERSION:2.0

PRODID:Me

BEGIN:VEVENT

DTEND:20211111T145959Z

DTSTART:20211109T150001Z

SUMMARY:有給休暇

UID:f95dbfd9-5b65-4feb-93d9-8fb85221e14e@f95d.org

END:VEVENT

BEGIN:VEVENT

DESCRIPTION:○○について\n××について

DTEND:20211108T040000Z

DTSTART:20211108T030000Z

SUMMARY:A社と打ち合わせ

UID:529095df-3716-4f78-ada7-485cbf1456a7@5290.org

END:VEVENT

END:VCALENDAR

Googleカレンダーに取り込んでみるとちゃんと予定が反映されている。

次にファイルの読み込み。

ics_read.py

from ics import Calendar

with open('my.ics', 'r', encoding='utf-8') as f:
    ics_str = f.read()

cal = Calendar(ics_str)

print(cal.events)
python ics_read.py
{<Event '有給休暇' begin:2021-11-09T15:00:01+00:00 end:2021-11-11T14:59:59+00:00>, <Event 'A社と打ち合わせ' begin:2021-11-08T03:00:00+00:00 end:2021-11-08T04:00:00+00:00>}

読み込み時もUTCになってしまうのでそこのケアが必要。

その他細かいライブラリの仕様も公式ドキュメントに書かれてる。

元記事はこちら

https://qiita.com/danishi/items/94ea326523291f284117