python - 在 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)
解决方案
问题:在一个事件中发现错误时继续下一个事件?
- 现场演示 - repl.it
- 虚拟对象
VObject 旨在成为一个功能齐全的 Python 包,用于解析和生成 vCard 和 vCalendar 文件
验证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)
推荐阅读
- c - Win32 C++ 如何处理 ListView 子类中的 LVM_SETCOLUMNWIDTH?
- flowtype - 如何调试 Flow 声明?
- android - Android 相机意图在 Android 11 中没有响应
- python - 如何优化我的字谜搜索功能?
- matplotlib - 如何在 Pytorch 中使用 tensorboard 可视化所有预测?
- powershell - Azure Devops 使用 powershell 审核 rest api 延续令牌
- fortran - icc(或 mpiicc)-E 标志有什么作用?
- javascript - 是否可以使用方法对数组道具进行排序?
- python - 我希望扩展用户(供应商)只能在仪表板上查看他或她的产品、订单和客户
- node.js - 如果不使用 TZ 环境变量,节点如何确定时区?