我有一个文件,我希望使用python以json数组格式读取。我发现有一个名为icalendar 3.11的软件包,但它并没有将iCalendar文本转换为json数组格式。
请参阅下面的icalendar文字:
BEGIN:VCALENDAR
PRODID;X-RICAL-TZSOURCE=TZINFO:-//Airbnb Inc//Hosting Calendar 0.8.8//EN
CALSCALE:GREGORIAN
VERSION:2.0
BEGIN:VEVENT
DTEND;VALUE=DATE:20161111
DTSTART;VALUE=DATE:20161110
UID:-4sxkntmd7ehk-4ybn124l9iwr@bnbhome.com
DESCRIPTION:CHECKIN: 11/10/2016\nCHECKOUT: 11/11/2016\nNIGHTS: 1\nPHONE:
+1 (111) 111-1111\nEMAIL: gregory-66i5v1thmkdva1u4@test.bnb.com\nPRO
PERTY: Rittenhouse Square Cozy Studio Apartment\n
SUMMARY:John Smith (XXXXXX)
LOCATION:Rittenhouse Square Cozy Studio Apartment
END:VEVENT
BEGIN:VEVENT
DTEND;VALUE=DATE:20170104
DTSTART;VALUE=DATE:20170102
UID:-4sxkntmd7ehk-wps9gpnpzxkj@bnbhome.com
DESCRIPTION:CHECKIN: 01/02/2017\nCHECKOUT: 01/04/2017\nNIGHTS: 2\nPHONE:
+1 (222) 222-2222\nEMAIL: darren-3rntph9q5fqzbao2@test.bnb.com\nPROP
ERTY: Rittenhouse Square Cozy Studio Apartment\n
SUMMARY:Abe Lincoln (XXXXXX)
LOCATION:Rittenhouse Square Cozy Studio Apartment
END:VEVENT
END:VCALENDAR
利用iCalendar Package here,我尝试了以下内容:
from icalendar import Calendar
result = Calendar().from_ical(ical_content)
结果
VCALENDAR({u'CALSCALE': vText('GREGORIAN'), u'VERSION': vText('2.0'), u'PRODID': vText('-//Airbnb Inc//Hosting Calendar 0.8.8//EN')}, VEVENT({u'LOCATION': vText('Rittenhouse Square Cozy Studio Apartment'), u'DESCRIPTION': vText('CHECKIN: 11/10/2016\nCHECKOUT: 11/11/2016\nNIGHTS: 1\nPHONE: +1 (111) 111-1111\nEMAIL: gregory-66i5v1thmkdva1u4@test.bnb.com\nPROPERTY: Rittenhouse Square Cozy Studio Apartment\n'), u'UID': vText('-4sxkntmd7ehk-4ybn124l9iwr@bnbhome.com'), u'DTEND': <icalendar.prop.vDDDTypes object at 0x1041e5610>, u'DTSTART': <icalendar.prop.vDDDTypes object at 0x1041e58d0>, u'SUMMARY': vText('John Smith (XXXXXX)')}),VEVENT({u'LOCATION': vText('Rittenhouse Square Cozy Studio Apartment'), u'DESCRIPTION': vText('CHECKIN: 01/02/2017\nCHECKOUT: 01/04/2017\nNIGHTS: 2\nPHONE: +1 (222) 222-2222\nEMAIL: darren-3rntph9q5fqzbao2@test.bnb.com\nPROPERTY: Rittenhouse Square Cozy Studio Apartment\n'), u'UID': vText('-4sxkntmd7ehk-wps9gpnpzxkj@bnbhome.com'), u'DTEND': <icalendar.prop.vDDDTypes object at 0x10441c690>, u'DTSTART': <icalendar.prop.vDDDTypes object at 0x10441c6d0>, u'SUMMARY': vText('Abe Lincoln (XXXXXX)')}))
如何将此icalendar文本转换为json数组?
答案 0 :(得分:0)
非常讨厌的方式,但做的工作:
ical_content = """
BEGIN:VCALENDAR
PRODID;X-RICAL-TZSOURCE=TZINFO:-//Airbnb Inc//Hosting Calendar 0.8.8//EN
CALSCALE:GREGORIAN
VERSION:2.0
BEGIN:VEVENT
DTEND;VALUE=DATE:20161111
DTSTART;VALUE=DATE:20161110
UID:-4sxkntmd7ehk-4ybn124l9iwr@bnbhome.com
DESCRIPTION:CHECKIN: 11/10/2016\nCHECKOUT: 11/11/2016\nNIGHTS: 1\nPHONE:
+1 (111) 111-1111\nEMAIL: gregory-66i5v1thmkdva1u4@test.bnb.com\nPRO
PERTY: Rittenhouse Square Cozy Studio Apartment\n
SUMMARY:John Smith (XXXXXX)
LOCATION:Rittenhouse Square Cozy Studio Apartment
END:VEVENT
BEGIN:VEVENT
DTEND;VALUE=DATE:20170104
DTSTART;VALUE=DATE:20170102
UID:-4sxkntmd7ehk-wps9gpnpzxkj@bnbhome.com
DESCRIPTION:CHECKIN: 01/02/2017\nCHECKOUT: 01/04/2017\nNIGHTS: 2\nPHONE:
+1 (222) 222-2222\nEMAIL: darren-3rntph9q5fqzbao2@test.bnb.com\nPROP
ERTY: Rittenhouse Square Cozy Studio Apartment\n
SUMMARY:Abe Lincoln (XXXXXX)
LOCATION:Rittenhouse Square Cozy Studio Apartment
END:VEVENT
END:VCALENDAR
"""
import icalendar
from icalendar import Calendar
result = Calendar().from_ical(ical_content)
import json
r = []
for key, value in result.property_items():
inner_d = {}
if isinstance(value, icalendar.prop.vDDDTypes):
inner_d[key] = value.dt.isoformat()
else:
inner_d[key] = value
r.append(inner_d)
u = json.dumps(r, indent=4)
print(u)
输出是:
[
{
"BEGIN": "VCALENDAR"
},
{
"VERSION": "2.0"
},
{
"PRODID": "-//Airbnb Inc//Hosting Calendar 0.8.8//EN"
},
{
"CALSCALE": "GREGORIAN"
},
{
"BEGIN": "VEVENT"
},
{
"SUMMARY": "John Smith (XXXXXX)"
},
{
"DTSTART": "2016-11-10"
},
{
"DTEND": "2016-11-11"
},
{
"UID": "-4sxkntmd7ehk-4ybn124l9iwr@bnbhome.com"
},
{
"CHECKOUT": " 11/11/2016"
},
{
"DESCRIPTION": "CHECKIN: 11/10/2016"
},
{
"EMAIL": " gregory-66i5v1thmkdva1u4@test.bnb.com"
},
{
"LOCATION": "Rittenhouse Square Cozy Studio Apartment"
},
{
"NIGHTS": " 1"
},
{
"PHONE": "+1 (111) 111-1111"
},
{
"PROPERTY": " Rittenhouse Square Cozy Studio Apartment"
},
{
"END": "VEVENT"
},
{
"BEGIN": "VEVENT"
},
{
"SUMMARY": "Abe Lincoln (XXXXXX)"
},
{
"DTSTART": "2017-01-02"
},
{
"DTEND": "2017-01-04"
},
{
"UID": "-4sxkntmd7ehk-wps9gpnpzxkj@bnbhome.com"
},
{
"CHECKOUT": " 01/04/2017"
},
{
"DESCRIPTION": "CHECKIN: 01/02/2017"
},
{
"EMAIL": " darren-3rntph9q5fqzbao2@test.bnb.com"
},
{
"LOCATION": "Rittenhouse Square Cozy Studio Apartment"
},
{
"NIGHTS": " 2"
},
{
"PHONE": "+1 (222) 222-2222"
},
{
"PROPERTY": " Rittenhouse Square Cozy Studio Apartment"
},
{
"END": "VEVENT"
},
{
"END": "VCALENDAR"
}
]
希望这有帮助:)