Python使用icalendar解析ICS文件参会者PARTSTAT状态并存入DataFrame
解决方案
你报错的核心原因有两个:
- 当事件包含多名参会者时,
event.get('attendee')返回的是参会者对象列表,不是单个对象,无法直接调用.params属性;如果事件只有1名参会者,返回的是单个参会者对象,两种结构不统一。 - icalendar库的参数键名是全大写格式,你写小写的
partstat也无法匹配到对应值。
另外你原有代码的结构会把所有参会者塞到同一行的attendee字段中,无法和参会状态一一对应,建议调整为每个参会者单独占一行的存储结构,修改后的代码如下:
import pandas as pd from icalendar import Calendar # 初始化总表 allevents = pd.DataFrame(columns = ['uid', 'start', 'end', 'summary', 'attendee', 'partstat','description']) icsfile = "替换为你的ics文件路径" # 读取解析ics文件 with open(icsfile, 'rb') as g: gcal = Calendar.from_ical(g.read()) for event in gcal.walk('vevent'): # 提取事件公共字段 base_info = { 'uid': event.get('uid'), 'start': event.decoded('dtstart'), 'end': event.decoded('dtend'), 'summary': event.get('summary'), 'description': event.get('description') } # 兼容处理:单个参会者返回对象,多个返回列表,统一转成列表处理 attendees = event.get('attendee', []) if not isinstance(attendees, list): attendees = [attendees] # 遍历每个参会者提取对应状态 for att_obj in attendees: row = base_info.copy() # 参会者邮箱是对象本身的字符串值 row['attendee'] = str(att_obj) # 提取PARTSTAT参数,无参数时默认返回UNKNOWN避免报错 row['partstat'] = att_obj.params.get('PARTSTAT', 'UNKNOWN') # 插入总表 allevents = pd.concat([allevents, pd.DataFrame([row])], ignore_index=True)
可选调整
如果你确实需要把同一事件的所有参会者和状态存在同一行,可以把遍历得到的所有(邮箱, 状态)对拼成字典或字符串存入对应字段,示例:
# 替换上面的遍历参会者部分即可 att_info = [] for att_obj in attendees: email = str(att_obj) stat = att_obj.params.get('PARTSTAT', 'UNKNOWN') att_info.append(f"{email}:{stat}") base_info['attendee'] = ','.join([x.split(':')[0] for x in att_info]) base_info['partstat'] = ','.join([x.split(':')[1] for x in att_info]) allevents = pd.concat([allevents, pd.DataFrame([base_info])], ignore_index=True)
内容的提问来源于stack exchange,提问作者jw_python_yikes
相关产品推荐
相关产品推荐

