2012-02-10 34 views
3

我一直在想,是否有更简洁快捷的方法来解析可能来自多个位置/日志文件的3种格式的时间戳。下面的代码是我目前的代码,但它的工作版本非常难看,而且速度非常慢。是否有更加pythonic和更快的方式来实现这一目标?解析时间字符串的更好方法

FORMATS = ["%Y-%m-%d %H:%M:%S"  , 
      "%Y%m%d_%H.%M.%S"  , 
      "%a %b %d %H:%M:%S %Y"] 


def _hacktime(self, t): 
    # CAUTION: 
    # The nastiest time hack of all TIME 
    # 
    try: 
     t = time.mktime(time.strptime(t, self.FORMATS[0])) 
    except: 
     try: 
      t = time.mktime(time.strptime(t, self.FORMATS[1])) 
     except: 
      try: 
       t = time.mktime(time.strptime(' '.join([t, 
               time.strftime('%Y')]), 
               self.FORMATS[2])) 
      except Exception as e: 
       print('could not convert time %s: %s' % (t, e)) 
       t = time.time() 
    return [t, time.ctime(t)] 
+0

为什么你要为第三种格式的时间字符串附加'%Y'?简单地从格式字符串中省略它会不会更容易? – 2012-02-10 10:50:32

回答

5

使用循环

the_time= None 
for f in FORMATS: 
    try: 
     the_time = time.mktime(time.strptime(t, f)) 
     return the_time # or break 
    except ValueError: 
     continue 
if the_time is None: 
    raise ValueError("{0!r} is not a valid time".format(t)) 
+4

我建议在try块的末尾使用'break',并在for循环中使用'else'子句而不是检查'None'。 – 2012-02-10 10:58:38

+0

我接受了这个,因为它是迄今为止最好的。我最终的解决方案是将文件扩展名传递给函数,并将其路由到正确的解析器格式。虽然strptime()仍然是我的应用程序中最慢的过程,但我的处理减少了20%。 – comamitc 2012-02-13 13:43:32

1

那么你可以做一个正则表达式来匹配前两者,拉出组件字段。

我想这会减少到两个分支,因为如果匹配失败,它必须是第三个模式。

如果确实匹配,则可以直接填充struct_time,因为您具有所有匹配的字段。

0

您可以检查“ - ”,“:”和“”试图将其与strptime转换之前计数的字符串。而不是尝试和捕捉异常,同时为每次尝试缩进更多,使用循环并在转换工作后跳出循环(或仅返回)。