首页 > 解决方案 > 在 Python 中将日历 .ics 转换为 CSV

问题描述

以下代码运行良好,直到找到没有字段描述的事件(不确定是如何发生的),当在一个事件中发现错误时,有没有办法继续下一个事件?

# ics to csv example
# dependency: https://pypi.org/project/vobject/

import vobject
import csv

with open('sample.csv', mode='w') as csv_out:
    csv_writer = csv.writer(csv_out, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    csv_writer.writerow(['WHAT', 'WHO', 'FROM', 'TO', 'DESCRIPTION'])

    # read the data from the file
    data = open("sample.ics").read()

    # iterate through the contents
    for cal in vobject.readComponents(data):
        for component in cal.components():
            if component.name == "VEVENT":
                # write to csv
                csv_writer.writerow([component.summary.valueRepr(),component.attendee.valueRepr(),component.dtstart.valueRepr(),component.dtend.valueRepr(),component.description.valueRepr()])

这现在按预期工作。谢谢@stovfl

import vobject
import csv

with open('calendar2022.csv', mode='w') as csv_out:
csv_writer = csv.writer(csv_out, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
csv_writer.writerow(['WHAT', 'FROM', 'TO', 'DESCRIPTION', 'LOCATION'])

    # read the data from the file
data = open("calendar.ics").read()

    # iterate through the contents
for cal in vobject.readComponents(data):
    for component in cal.components():
        if component.name == "VEVENT":
            writerow = []
            for attr in ['summary', 'dtstart', 'dtend', 'description', 'location']:
                if hasattr(component, attr):
                    writerow.append(getattr(component, attr).valueRepr())
                else:
                    writerow.append('Undefined!')

            print(writerow)
            csv_writer.writerow(writerow)

标签: pythoncalendar

解决方案


问题:在一个事件中发现错误时继续下一个事件?


验证all属性是否存在于 中'VENVENT',如果不存在,则break跳过此步骤'VEVENT'并继续。

      if component.name == "VEVENT":
          # write to csv

          # verify if all attr in component
          attr_list = ('summary', 'attendee', 'dtstart', 'dtend', 'description')

          if not all((hasattr(component, attr) for attr in attr_list)):
            break

而不是跳过VEVENT并继续,用值替换缺少的列Undefined!

      if component.name == "VEVENT":
          # write to csv

          # aggregate column values
          writerow = []
          for attr in ['summary', 'attendee', 'dtstart', 'dtend', 'description']:

              if hasattr(component, attr):
                  writerow.append(getattr(component, attr).valueRepr())
              else:
                  writerow.append('Undefined!')

          print(writerow)
          # csv_writer.writerow(writerow)

推荐阅读