You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:15:04