2015-10-14 116 views
0

我有这个变量叫做pubdate,它来自rss提要。大多数时候这是一个时间元组,这是我想要的,所以没有错误。关于日期时间和时间的Python错误处理

有时它是一个unicode字符串,这就是它讨厌的地方。

到目前为止,我有一个关于pubdate这下面的代码时,它是Unicode字符串:

if isinstance(pubdate, unicode): 
    try: 
     pubdate = time.mktime(datetime.strptime(pubdate, '%d/%m/%Y %H:%M:%S').timetuple()) # turn the string into a unix timestamp 
    except ValueError: 
     pubdate = re.sub(r'\w+,\s*', '', pubdate) # removes day words from string, i.e 'Mon', 'Tue', etc. 
     pubdate = time.mktime(datetime.strptime(pubdate, '%d %b %Y %H:%M:%S').timetuple()) # turn the string into a unix timestamp 

但我的问题是,如果unicode字符串pubdate是从一个except ValueError子句中不同的格式它会再次提出ValueError,处理多个ValueError个案的pythonic方式是什么?

+0

的'datetime'模块可以解析'Mon'为好。如果可能,发布样本输入/输出。 – luoluo

+0

这只是个人喜好,我删除了星期一,星期二等等。一个会引发另一个“ValueError”的例子输入是'pubdate = 10/14/2015 11:11',因为它没有秒。这是我无法控制的,因为它来自rss提要。我只是无法处理由于'pubdate'格式化而发生的多个ValueError异常。 – hooliooo

回答

3

当你正在分析从RSS日期字符串。分析日期字符串时可能需要一些猜测。我建议您使用dateutil而不是日期时间模块。

dateutil.parser提供了一个通用的日期/时间字符串分析器,它能够解析大多数已知格式来表示日期和/或时间。

这个函数的原型是:parse(timestr)(你不必自己指定格式)。

DEMO

>>> parse("2003-09-25T10:49:41") 
datetime.datetime(2003, 9, 25, 10, 49, 41) 

>>> parse("2003-09-25T10:49") 
datetime.datetime(2003, 9, 25, 10, 49) 

>>> parse("2003-09-25T10") 
datetime.datetime(2003, 9, 25, 10, 0) 

>>> parse("2003-09-25") 
datetime.datetime(2003, 9, 25, 0, 0) 

>>> parse("Sep 03", default=DEFAULT) 
datetime.datetime(2003, 9, 3, 0, 0) 

模糊解析:

>>> s = "Today is 25 of September of 2003, exactly " \ 
...  "at 10:49:41 with timezone -03:00." 
>>> parse(s, fuzzy=True) 
datetime.datetime(2003, 9, 25, 10, 49, 41, 
       tzinfo=tzoffset(None, -10800)) 
+1

这几乎消除了我需要多次尝试和unicode日期字符串的除外方法。谢谢 – hooliooo

+0

哈哈,很高兴帮助。 – luoluo

1

你可以采取以下方法:

from datetime import datetime 
import time 

pub_dates = ['2/5/2013 12:23:34', 'Monday 2 Jan 2013 12:23:34', 'mon 2 Jan 2013 12:23:34', '10/14/2015 11:11', '10 2015'] 

for pub_date in pub_dates: 
    pubdate = 0  # value if all conversion attempts fail 

    for format in ['%d/%m/%Y %H:%M:%S', '%d %b %Y %H:%M:%S', '%a %d %b %Y %H:%M:%S', '%A %d %b %Y %H:%M:%S', '%m/%d/%Y %H:%M']: 
     try: 
      pubdate = time.mktime(datetime.strptime(pub_date, format).timetuple()) # turn the string into a unix timestamp 
      break 
     except ValueError as e: 
      pass 

    print '{:<12} {}'.format(pubdate, pub_date) 

给予输出:

1367493814.0 2/5/2013 12:23:34 
1357129414.0 Monday 2 Jan 2013 12:23:34 
1357129414.0 mon 2 Jan 2013 12:23:34 
1444817460.0 10/14/2015 11:11 
0    10 2015