2016-11-23 55 views
0

我有一个ical文件,我想阅读使用python的json数组格式。我发现有一个名为icalendar 3.11的包,但它不会将iCalendar Text转换为json数组格式。如何使用python从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:[email protected] 
DESCRIPTION:CHECKIN: 11/10/2016\nCHECKOUT: 11/11/2016\nNIGHTS: 1\nPHONE: 
+1 (111) 111-1111\nEMAIL: [email protected]\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:[email protected] 
DESCRIPTION:CHECKIN: 01/02/2017\nCHECKOUT: 01/04/2017\nNIGHTS: 2\nPHONE: 
+1 (222) 222-2222\nEMAIL: [email protected]\nPROP 
ERTY: Rittenhouse Square Cozy Studio Apartment\n 
SUMMARY:Abe Lincoln (XXXXXX) 
LOCATION:Rittenhouse Square Cozy Studio Apartment 
END:VEVENT 
END:VCALENDAR 

利用的iCalendar包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: [email protected]\nPROPERTY: Rittenhouse Square Cozy Studio Apartment\n'), u'UID': vText('[email protected]'), 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: [email protected]\nPROPERTY: Rittenhouse Square Cozy Studio Apartment\n'), u'UID': vText('[email protected]'), 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

很讨厌的方式,但做的工作:

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:[email protected] 
DESCRIPTION:CHECKIN: 11/10/2016\nCHECKOUT: 11/11/2016\nNIGHTS: 1\nPHONE: 
+1 (111) 111-1111\nEMAIL: [email protected]\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:[email protected] 
DESCRIPTION:CHECKIN: 01/02/2017\nCHECKOUT: 01/04/2017\nNIGHTS: 2\nPHONE: 
+1 (222) 222-2222\nEMAIL: [email protected]\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": "[email protected]" 
    }, 
    { 
     "CHECKOUT": " 11/11/2016" 
    }, 
    { 
     "DESCRIPTION": "CHECKIN: 11/10/2016" 
    }, 
    { 
     "EMAIL": " [email protected]" 
    }, 
    { 
     "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": "[email protected]" 
    }, 
    { 
     "CHECKOUT": " 01/04/2017" 
    }, 
    { 
     "DESCRIPTION": "CHECKIN: 01/02/2017" 
    }, 
    { 
     "EMAIL": " [email protected]" 
    }, 
    { 
     "LOCATION": "Rittenhouse Square Cozy Studio Apartment" 
    }, 
    { 
     "NIGHTS": " 2" 
    }, 
    { 
     "PHONE": "+1 (222) 222-2222" 
    }, 
    { 
     "PROPERTY": " Rittenhouse Square Cozy Studio Apartment" 
    }, 
    { 
     "END": "VEVENT" 
    }, 
    { 
     "END": "VCALENDAR" 
    } 
] 

希望这有助于:)

+0

它 - 唯一的问题是,你”只显示其中一个结果。例如,约翰史密斯在原始事件中怎么样? – Chris

+0

哦,得到它:)相同的键 - W8秒我会做一个编辑。 – opalczynski

+0

@Chris立即检查。 – opalczynski