使用python生成ical日歷文件——將課程表導入到手機日歷


  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.使用電腦或者手機等的日歷軟件的導入功能,即可將事件導入到日歷的日程中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM