2012-02-10 56 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轉換之前計數的字符串。而不是嘗試和捕捉異常,同時爲每次嘗試縮進更多,使用循環並在轉換工作後跳出循環(或僅返回)。