前言

在了解了ical文件的基本结构之后,理论上是可以自己写出ical文件了。但是,如果把课程表的所有课全部一个个写出来就很不程序员,毕竟能交给电脑自动干的从不手动干。 一开始我是想着自己写一个可以批量生成ical文件的函数。写完之后感觉自己写很繁琐,不够简洁,毕竟python之蝉是这样说的:

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

所以,看了好多第三方库,找到了一个感觉还行的第三方库icalendar

icalendar库

唯一美中不足的是这个库的官方文档没有中文,不过也还好理解,比较简单。
首先下载该库

    pip install icalendar

引入

    from icalendar import Calendar, Event,Alarm

常用的方法
1.建立一个日历-----Calendar()方法
实例:

     cal = Calendar()

2.在日历中添加组件-----add(属性名,值)

    cal.add('VERSION','2.0')
    cal.add('X-WR-CALNAME','生成ics文件测试')
    cal.add('X-APPLE-CALENDAR-COLOR','#540EB9')
    cal.add('X-WR-TIMEZONE','Asia/Shanghai')

这些参数的意义在我的这篇文章中讲到

3.在日历中添加子组件(事件)-----Event

    event=Event()

4.为事件添加属性-----add(属性名,值)

    event.add('UID','2000')
    event.add('DTSTART;VALUE=DATE','20200808T170500')
    event.add('DTEND;VALUE=DATE','20200808T172000')
    event.add('SUMMARY','测试事件键')
    event.add('SEQUENCE','0')
    event.add('DESCRIPTION','这是描述')
    event.add('LOCATION','这是地点')

5.添加子组件(Event)的子组件(Alarm)

    alarm=Alarm()
    alarm.add('ACTION','NONE')
    alarm.add('TRIGGER;VALUE=DATE-TIME','19760401T005545Z')
    event.add_component(alarm)

6.将事件添加到日历-----add_component()

    cal.add_component(event)

一个日历可添加多个事件
7.生成ical文件

    f = open('example.ics', 'wb')
    f.write(cal.to_ical())
    f.close()

其中to_ical()方法将之前写的代码生成字符串,方便我们写入文件

8.总结

总的代码,添加多个事件时格式如下

    cal = Calendar()
    cal.add('VERSION','2.0')
    cal.add('X-WR-CALNAME','生成ics文件测试')
    cal.add('X-APPLE-CALENDAR-COLOR','#540EB9')
    cal.add('X-WR-TIMEZONE','Asia/Shanghai')

    event = Event()
    event.add('UID','2000')
    event.add('DTSTART;VALUE=DATE','20200808T170500')
    event.add('DTEND;VALUE=DATE','20200808T172000')
    event.add('SUMMARY','测试事件键')
    event.add('SEQUENCE','0')
    event.add('DESCRIPTION','这是描述')
    event.add('LOCATION','这是地点')
    alarm=Alarm()
    alarm.add('ACTION','NONE')
    alarm.add('TRIGGER;VALUE=DATE-TIME','19760401T005545Z')
    event.add_component(alarm)

    eventt=Event()
    eventt.add('UID','2001')
    eventt.add('DTSTART;VALUE=DATE','20200808T180500')
    eventt.add('DTEND;VALUE=DATE','20200808T182000')
    eventt.add('SUMMARY','测试事件2')
    eventt.add('SEQUENCE','0')
    eventt.add('DESCRIPTION','这是描述2')
    eventt.add('LOCATION','这是地点2')
    alarmm=Alarm()
    alarmm.add('ACTION','NONE')
    alarmm.add('TRIGGER;VALUE=DATE-TIME','19760401T005545Z')
    eventt.add_component(alarmm)

    cal.add_component(event)
    cal.add_component(eventt)
    f = open('例子.ics', 'wb')
    f.write(cal.to_ical())
    f.close()

生成的文件内部代码如下:

BEGIN:VCALENDAR
VERSION:2.0
X-APPLE-CALENDAR-COLOR:#540EB9
X-WR-CALNAME:生成ics文件测试
X-WR-TIMEZONE:Asia/Shanghai
BEGIN:VEVENT
SUMMARY:测试事件键
UID:2000
SEQUENCE:0
DESCRIPTION:这是描述
DTEND;VALUE=DATE:20200808T172000
DTSTART;VALUE=DATE:20200808T170500
LOCATION:这是地点
BEGIN:VALARM
ACTION:NONE
TRIGGER;VALUE=DATE-TIME:19760401T005545Z
END:VALARM
END:VEVENT
BEGIN:VEVENT
SUMMARY:测试事件键2
UID:2000
SEQUENCE:0
DESCRIPTION:这是描述2
DTEND;VALUE=DATE:20200808T182000
DTSTART;VALUE=DATE:20200808T182000
LOCATION:这是地点2
BEGIN:VALARM
ACTION:NONE
TRIGGER;VALUE=DATE-TIME:19760401T005545Z
END:VALARM
END:VEVENT
END:VCALENDAR