ics文件是日歷軟件中很常見的格式,可以將日歷賬戶中的日程安排導出成.ics文件,也可以將.ics文件中的事件導入到日歷中。那么我們如何使用python來生成Ics文件呢?我們可以先找一個ics文件,用文本的方式來打開這個文件,看看一個,ics文件里都包含了那些信息,我們使用python拼湊出相同格式的信息,寫入文本文件並且使用ics后綴結尾不就可以了嗎?
這是我在日歷中創建日程事件之后導出的.ics文件中的片段:
BEGIN:VCALENDAR
PRODID:-//ZHONG_BAI_REN//APPGENIX-SOFTWARE//
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:my_schedule
X-WR-TIMEZONE:null
BEGIN:VEVENT
SUMMARY:工程電磁場
ORGANIZER;CN=My Calendar:mailto:nobody@gmail.com
DTSTART;TZID=Asia/Shanghai:20190513T082000
DTEND;TZID=Asia/Shanghai:20190513T095500
DTSTAMP:20190221T202219Z
UID:20190221T202219Z-11@appgenix-software.com
SEQUENCE:0
CREATED:20190221T202219Z
DESCRIPTION:李風從-主講
LAST-MODIFIED:20190221T202219Z
LOCATION:2-006
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
從這個代碼片段就可以看出ics文件的大致結構,文件以BEGIN:VCALENDAR開頭,END:VCALENDAR結尾,事件以BEGIN:VEVENT開頭,以END:VEVENT結尾。仔細查看了各個字段名稱和字段后面的內容后可以猜知道
每個字段的含義,再根據每個字段的含義來編寫python代碼。
貼上代碼:
1 import datetime,os 2 3 class Event: 4 """ 5 事件對象 6 """ 7 def __init__(self,kwargs): 8 self.event_data = kwargs 9 10 def __turn_to_string__(self): 11 self.event_text = "BEGIN:VEVENT\n" 12 for item,data in self.event_data.items(): 13 item = str(item).replace("_","-") 14 if item not in ["ORGANIZER","DTSTART","DTEND"]: 15 self.event_text += "%s:%s\n"%(item,data) 16 else: 17 self.event_text += "%s;%s\n"%(item,data) 18 self.event_text += "END:VEVENT\n" 19 return self.event_text 20 21 class Calendar: 22 """ 23 日歷對象 24 """ 25 def __init__(self,calendar_name="My Calendar"): 26 self.__events__ = {} 27 self.__event_id__ = 0 28 self.calendar_name = calendar_name 29 30 def add_event(self,**kwargs): 31 event = Event(kwargs) 32 event_id = self.__event_id__ 33 self.__events__[self.__event_id__] = event 34 self.__event_id__ += 1 35 return event_id 36 37 def modify_event(self,event_id,**kwargs): 38 for item,data in kwargs.items(): 39 self.__events__[event_id].event_data[item] = data 40 41 def remove_event(self,event_id): 42 self.__events__.pop(event_id) 43 44 def get_ics_text(self): 45 self.__calendar_text__ = """BEGIN:VCALENDAR\nPRODID:-//ZHONG_BAI_REN//APPGENIX-SOFTWARE//\nVERSION:2.0\nCALSCALE:GREGORIAN\nMETHOD:PUBLISH\nX-WR-CALNAME:%s\nX-WR-TIMEZONE:null\n"""%self.calendar_name 46 for key,value in self.__events__.items(): 47 self.__calendar_text__ += value.__turn_to_string__() 48 self.__calendar_text__ += "END:VCALENDAR" 49 return self.__calendar_text__ 50 51 def save_as_ics_file(self): 52 ics_text = self.get_ics_text() 53 open("%s.ics"%self.calendar_name,"w",encoding="utf8").write(ics_text)#使用utf8編碼生成ics文件,否則日歷軟件打開是亂碼 54 55 def open_ics_file(self): 56 os.system("%s.ics"%self.calendar_name) 57 58 def add_event(cal, SUMMARY, DTSTART, DTEND, DESCRIPTION, LOCATION): 59 """ 60 向Calendar日歷對象添加事件的方法 61 :param cal: calender日歷實例 62 :param SUMMARY: 事件名 63 :param DTSTART: 事件開始時間 64 :param DTEND: 時間結束時間 65 :param DESCRIPTION: 備注 66 :param LOCATION: 時間地點 67 :return: 68 """ 69 time_format = "TZID=Asia/Shanghai:{date.year}{date.month:0>2d}{date.day:0>2d}T{date.hour:0>2d}{date.minute:0>2d}00" 70 dt_start = time_format.format(date=DTSTART) 71 dt_end = time_format.format(date=DTEND) 72 create_time = datetime.datetime.today().strftime("%Y%m%dT%H%M%SZ") 73 cal.add_event( 74 SUMMARY=SUMMARY, 75 ORGANIZER="CN=My Calendar:mailto:nobody@gmail.com", 76 DTSTART=dt_start, 77 DTEND=dt_end, 78 DTSTAMP=create_time, 79 UID="{}-11@appgenix-software.com".format(create_time), 80 SEQUENCE="0", 81 CREATED=create_time, 82 DESCRIPTION=DESCRIPTION, 83 LAST_MODIFIED=create_time, 84 LOCATION=LOCATION, 85 STATUS="CONFIRMED", 86 TRANSP="OPAQUE" 87 ) 88 89 if __name__ == '__main__': 90 calendar = Calendar(calendar_name="test") 91 add_event(calendar, 92 SUMMARY="測試", 93 DTSTART=datetime.datetime(year=2019,month=2,day=19,hour=21,minute=21,second=00), 94 DTEND=datetime.datetime(year=2019,month=2,day=19,hour=21,minute=30,second=00), 95 DESCRIPTION="測試事件", 96 LOCATION="我也不知道在哪兒") 97 print(calendar.get_ics_text()) 98 calendar.save_as_ics_file()
代碼的使用方法:
1.創建Calendar日歷對象,傳入可選參數“calendar_name”(同時也是生成的ics文件名,不傳入則為默認值“My Calendar”)
2.調用add_event方法,第一個參數傳入上一步的Calendar實例,然后依次傳入
參數作用 參數名 參數類型
日歷對象 cal Calender對象
事件名稱 SUMMARY 字符串類型
事件開始時間 DTSTART datetime類型
事件結束時間 DTEND datetime類型
事件發生地點 LOCATION 字符串類型
事件備注 DESCRIPTION 字符串類型
3.調用Calendar實例的save_as_ics_file()方法,即可在代碼的工作目錄里生成一個ics文件
4.使用電腦或者手機等的日歷軟件的導入功能,即可將事件導入到日歷的日程中。