使用Python iCalendar库筛选ICS事件写入新文件仅存最后一条问题求助
问题原因
- 目标日历对象
cal2的初始化放在了VEVENT遍历循环内部,每处理一条日历事件都会新建一个空的日历对象,之前添加的符合条件的事件会直接丢失 - 文件写入逻辑放在了事件匹配的循环内部,且使用的是
wb覆盖写入模式,每次写入都会清空之前的文件内容,最终只会保留最后一条符合条件的事件 - 存在冗余逻辑:已经遍历筛选到了VEVENT组件,不需要再嵌套一层
for event3 in component.walk()重复判断组件类型
修改后的可运行代码
from datetime import datetime from pytz import UTC from icalendar import Calendar, Event, vCalAddress # 补上原代码遗漏的导入 # 初始化目标日历对象,全局只需要创建一次 cal2 = Calendar() # 用with上下文管理器读取原文件,自动处理文件关闭 with open('Calendar_元データ.ics','rb') as g: gcal = Calendar.from_ical(g.read()) for component in gcal.walk(): if component.name == "VEVENT": DTSTAMP = component.get('DTSTAMP') UID = component.get('UID') ATTENDEE = component.get('ATTENDEE') CREATED = component.get('CREATED') SUMMARY = component.get('SUMMARY') DTSTART = component.get('DTSTART').dt DTEND = component.get('DTEND').dt LOCATION = component.get('LOCATION') CLASS = component.get('CLASS') DESCRIPTION = component.get('DESCRIPTION') PRIORITY = component.get('PRIORITY') ORGANIZER = component.get('ORGANIZER') LAST_MODIFIED = component.get('LAST-MODIFIED') X_NAVER_CATEGORY_ID = component.get('X-NAVER-CATEGORY-ID') TRIGGER = component.get('TRIGGER') ACTION = component.get('ACTION') # 筛选参会人符合要求的事件 if ATTENDEE is not None and '10059707' in ATTENDEE: # 原有调试打印逻辑可以保留 print ("1:{} \n 2:{} \n 3:{} \n 4:{} \n 5:{} \n 6:{} \n 7:{} \n 8:{} \n 9:{} \n 10:{} \n 11:{} \n 12:{} \n 13:{}\n 14:{}\n 15:{}\n 16:{}\n".format(DTSTAMP,UID,ATTENDEE,CREATED,SUMMARY,DTSTART,DTEND,LOCATION,CLASS,DESCRIPTION,PRIORITY,ORGANIZER,LAST_MODIFIED,X_NAVER_CATEGORY_ID,TRIGGER,ACTION)) print(ATTENDEE) # 新建事件对象并填充属性 event2 = Event() event2.add('DTSTAMP', DTSTAMP) event2.add('UID', UID) event2.add('attendee',vCalAddress(ATTENDEE)) event2.add('CREATED', CREATED) event2.add('summary', "作業予定あり") event2.add('DTSTART', DTSTART) event2.add('DTEND', DTEND) event2.add('LOCATION', LOCATION) event2.add('CLASS', CLASS) event2.add('DESCRIPTION', SUMMARY + " " + DESCRIPTION) event2.add('PRIORITY', PRIORITY) event2.add('ORGANIZER', vCalAddress(ORGANIZER)) event2.add('LAST-MODIFIED', LAST_MODIFIED) event2.add('X-NAVER-CATEGORY-ID', X_NAVER_CATEGORY_ID) event2.add('ACTION', ACTION) # 将事件添加到全局的目标日历对象中 cal2.add_component(event2) # 所有事件处理完成后统一写入文件,仅执行一次写入操作 with open('example.ics','wb') as f: f.write(cal2.to_ical())
内容的提问来源于stack exchange,提问作者WWWWWW
相关产品推荐
相关产品推荐

