我一直想知道是否有更简洁,更快捷的方法来解析时间戳,该时间戳可能是来自多个位置/日志文件的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 :(得分: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) )
答案 1 :(得分:1)
你可以制作一个正则表达式来匹配前两个,拉出组件字段。
我想这会将它减少到两个分支,因为如果匹配失败,它必须是第三个模式。
如果匹配,您可以直接填充struct_time
,因为您拥有所有匹配的字段。
答案 2 :(得分:0)
在尝试使用strptime转换它们之前,您可以检查字符串的“ - ”,“:”和“”计数。不是在为每次尝试缩进更多时尝试和捕获异常,而是在转换工作后使用循环并退出循环(或者只返回)。