ics文件:
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
VERSION:2.0
X-EVOLUTION-DATA-REVISION:2017-10-28T04:50:31.240215Z(0)
BEGIN:VTIMEZONE
TZID:/freeassociation.sourceforge.net/Asia/Kolkata
X-LIC-LOCATION:Asia/Kolkata
BEGIN:STANDARD
TZNAME:IST
DTSTART:19701014T230000
TZOFFSETFROM:+0530
TZOFFSETTO:+0530
END:STANDARD
END:VTIMEZONE
BEGIN:VTODO
UID:f13168013f7c8b9abc36c31e43028c34a3f40823
DTSTAMP:20171019T025556Z
SUMMARY:Trial
DTSTART;TZID=/freeassociation.sourceforge.net/Asia/Kolkata:
20171019T000000
DUE;TZID=/freeassociation.sourceforge.net/Asia/Kolkata:20171030T000000
PERCENT-COMPLETE:0
CLASS:PUBLIC
DESCRIPTION:Hello
SEQUENCE:2
CREATED:20171019T031330Z
LAST-MODIFIED:20171028T045031Z
CATEGORIES:Work
END:VTODO
END:VCALENDAR
问题出在第20-23行:
DTSTART;TZID=/freeassociation.sourceforge.net/Asia/Kolkata:
20171019T000000
DUE;TZID=/freeassociation.sourceforge.net/Asia/Kolkata:20171030T000000
因此,DTSTART的时间在下一行,而DUE的时间戳在同一行。因此,一个简单的python函数,如:
if line.startswith("DTSTART;TZID"):
line = next(finp)
dt = line.strip()[0:8]
两者都不适用。这个对于DUE不起作用,为了这个目的,我必须在没有next
的情况下创建另一个函数。
我如何处理任何此类日期/时间等而不考虑换行?
答案 0 :(得分:-1)
使用正则表达式对你的情况很有用, 试试这个:
import re
if line.startswith("DTSTART;TZID"):
line = next(finp)
dt = re.search('(.*)T.*', line).groups(1)
if line.startswith("DTSTART;TZID"):
dt = re.search('.*\:(.*)T.*', line).groups(1)
包装在()中的第一个组在两种情况下都是日期戳。
破译正则表达式; 。*匹配任何东西,直到明确命名的字符出现,这是在第一个场景'T'中,因为换行符和给我们的“普通”字符串。在第二个印章是在':'和'T'之间,它包含日期。
当您不确定该城市是否总是加尔各答等时,使用字符串切片会变得困难。