使用Python如何读取下载的.ics文件提取当日所有日程事件
Python 读取ics文件提取当日日程实现方案
1. 安装依赖库
我们使用ics库解析ics格式文件,Python 3.9+可使用自带的zoneinfo处理时区,低于3.9版本可安装pytz替代。
安装命令:
pip install ics python-dateutil # 如果Python版本<3.9,额外执行 pip install pytz
2. 完整实现代码
以下代码默认适配中国大陆时区(Asia/Shanghai),可根据自身需求修改时区参数:
from ics import Calendar from datetime import datetime from zoneinfo import ZoneInfo # Python<3.9 替换为 import pytz # 配置时区 TARGET_TZ = ZoneInfo("Asia/Shanghai") # Python<3.9 替换为 pytz.timezone("Asia/Shanghai") def get_today_events(ics_file_path): # 读取ics文件 with open(ics_file_path, 'r', encoding='utf-8') as f: cal = Calendar(f.read()) # 获取当日日期(转换为目标时区的日期) today = datetime.now(tz=TARGET_TZ).date() today_events = [] for event in cal.events: # 处理事件开始时间,区分全天事件和非全天事件 if hasattr(event.dtstart, 'tzinfo'): # 带时区的时间,转换为目标时区 event_start = event.dtstart.astimezone(TARGET_TZ) else: # 全天事件,dtstart是date对象,直接使用 event_start = event.dtstart # 匹配当日日期 if event_start.date() == today: today_events.append({ "title": event.name, "start_time": event_start, "end_time": event.dtend.astimezone(TARGET_TZ) if hasattr(event.dtend, 'tzinfo') else event.dtend, "description": event.description if hasattr(event, 'description') else "", "location": event.location if hasattr(event, 'location') else "" }) return today_events # 调用示例 if __name__ == "__main__": events = get_today_events("./your_schedule.ics") print(f"今日共有{len(events)}个日程:") for idx, e in enumerate(events, 1): print(f"\n{idx}. {e['title']}") print(f"时间:{e['start_time']} 至 {e['end_time']}") if e['location']: print(f"地点:{e['location']}")
3. 注意事项
- ics文件编码如果不是utf-8,可修改open方法的encoding参数,比如
encoding='gbk' - 全天事件的时间默认是0点,输出时可自行判断做格式优化
- 如果需要筛选其他日期,只需修改
today变量为对应datetime.date对象即可 - 部分从Outlook导出的ics文件可能存在格式兼容问题,可尝试将文件头的
X-WR-CALNAME等非标准字段删除后再解析
内容的提问来源于stack exchange,提问作者Twinlio
相关产品推荐
相关产品推荐

