Sin*_*ion 22
如果您不想要异常,请捕获异常.
try:
d = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
except ValueError:
d = None
Run Code Online (Sandbox Code Playgroud)
在Python的禅中,显式优于隐式.strptime
始终返回以指定的确切格式解析的日期时间.这是有道理的,因为你必须在失败的情况下定义行为,也许你真正想要的是.
except ValueError:
d = datetime.datetime.now()
Run Code Online (Sandbox Code Playgroud)
要么
except ValueError:
d = datetime.datetime.fromtimestamp(0)
Run Code Online (Sandbox Code Playgroud)
要么
except ValueError:
raise WebFramework.ServerError(404, "Invalid date")
Run Code Online (Sandbox Code Playgroud)
通过明确表示,下一个人会清楚地知道故障转移行为是什么,并且它是您需要的.
或者也许你确信日期不会无效; 它来自数据库DATETIME,列,在这种情况下,不会有捕获的异常,因此不要捕获它.
smc*_*mci 10
我们想要try...catch
多个日期时间格式fmt1,fmt2,...,fmtn
并抑制/处理strptime
所有不匹配的异常(from )(特别是,避免需要yukky n-deep缩进的try..catch
子句阶梯).我找到了两种优雅的方式,第二种是最好的方式.(这是现实世界数据中的一个大问题,其中多个,不匹配,不完整,不一致和多语言/区域日期格式通常在一个数据集中自由混合.)
1)单独尝试应用每种格式并将每个单独的strptime()
失败作为返回值处理None
,这样你就可以链接fn调用...
首先,从@OrWeis的答案中调整紧凑性:
def try_strptime_single_format(s, fmt):
try:
return datetime.datetime.strptime(s, fmt)
except ValueError:
return None
Run Code Online (Sandbox Code Playgroud)
现在您可以调用,try_strptime(s, fmt1) or try_strptime(s, fmt2) or try_strptime(s, fmt3) ...
但我们可以将其改进为:
2)应用多种可能的格式(作为参数传入或使用合理的默认值),迭代这些格式,捕获并处理内部的任何错误:
更清洁,更简单和更友好的OO是将这一点概括为使formats
参数成为单个字符串或列表,然后迭代...以便您的调用减少到try_strptime(s, [fmt1, fmt2, fmt3, ...])
def try_strptime(s, fmts=['%d-%b-%y','%m/%d/%Y']):
for fmt in fmts:
try:
return datetime.strptime(s, fmt)
except:
continue
return None # or reraise the ValueError if no format matched, if you prefer
Run Code Online (Sandbox Code Playgroud)
(作为侧边栏,请注意,这...finally
不是我们想要的机器人,因为它会在每次循环传递后执行,即在每个候选格式上执行,而不是在循环结束时执行.)
我发现实施2)更清洁,更好.特别地,该函数/方法可以存储默认格式的列表,这使得它更加安全,并且对现实世界数据的启发更少.(我们甚至可以根据其他列推断应用哪些默认格式,例如首先尝试德语数据的德语日期格式,阿拉伯语的阿拉伯语,博客数据的weblog日期时间格式等)
不,您要求的不是惯用的 Python,因此通常不会有像标准库中那样丢弃错误的函数。相关的标准库模块记录在此处:
http://docs.python.org/library/datetime.html
http://docs.python.org/library/time.html
解析函数都会在无效输入上引发异常。
但是,正如其他答案所述,为您的应用程序构建一个并不是非常困难(您的问题被表述为“在 Python 中”而不是“在 Python 标准库中”,因此不清楚是否协助编写这样的函数“在 Python 中”是否回答了这个问题)。
这是等效的功能实现
import datetime
def try_strptime(s, format):
"""
@param s the string to parse
@param format the format to attempt parsing of the given string
@return the parsed datetime or None on failure to parse
@see datetime.datetime.strptime
"""
try:
date = datetime.datetime.strptime(s, format)
except ValueError:
date = None
return date
Run Code Online (Sandbox Code Playgroud)
jnc*_*ton -2
strptime 怎么样?
http://docs.python.org/library/time.html#time.strptime
如果无法根据提供的格式解析字符串,它将抛出 ValueError。
编辑:
由于在我回答后问题被编辑以包含有关异常的部分。我想对此添加一条注释。
正如其他答案中所指出的,如果您不希望程序引发异常,您可以简单地捕获它并处理它:
try:
date = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
except ValueError:
date = None
Run Code Online (Sandbox Code Playgroud)
这是一种Python式的方式来做你想做的事。
归档时间: |
|
查看次数: |
18103 次 |
最近记录: |