2016-11-23 122 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