在我的Python脚本中,我传递带有--before参数的命令行选项date,即
myscript.py --before 2014-Aug-02然后我需要把它读入我的变量中。我想支持几种可能的日期格式,即2014-Aug-02,2014-08-02,2014-08,.
在我的脚本中,我有下面的构造来尝试匹配提供的日期格式,但在我看来它非常难看。有更好更优雅的方法吗?
if args.before:
try:
BEFORE = datetime.datetime.strptime(args.before[0], "%Y-%b-%d")
except ValueError:
try:
BEFORE = datetime.datetime.strptime(args.before[0], "%Y-%b")
except ValueError:
try:
BEFORE = datetime.datetime.strptime(args.before[0], "%Y-%m-%d")
except ValueError:
try:
BEFORE = datetime.datetime.strptime(args.before[0], "%Y-%m")
except ValueError:
try:
BEFORE = datetime.datetime.strptime(args.before[0], "%Y")
except ValueError:
print 'time data %s does not match format' % args.before[0]
exit(1)发布于 2014-08-02 16:06:23
我亲自使用 package解析任意日期:
from dateutil.parser import parse as date_parse
try:
BEFORE = date_parse(args.before[0])
except (TypeError, ValueError):
print 'time data %s does not match format' % args.before[0]
exit(1)dateutil解析器可以处理您想要支持的所有格式以及更多的格式。
但是,如果不希望安装外部依赖项,则创建支持的格式列表,并使用循环:
formats = ('%Y-%b-%d', '%Y-%b', '%Y-%m-%d', '%Y-%m', '%Y')
for format in formats:
try:
BEFORE = datetime.datetime.strptime(args.before[0], format)
break
except ValueError:
pass
else:
print 'time data %s does not match format' % args.before[0]
exit(1)一旦找到工作格式,循环将以break结束,否则将到达for循环的else:套件,并打印错误消息。请注意,当您提前爆发时,不会执行循环的else:套件。
发布于 2014-08-02 16:07:54
acceptedFormats = ("%Y-%b-%d", "%Y-%b", "%Y-%m-%d", "%Y-%m", "%Y")
if args.before:
for format in acceptedFormats:
try:
before = datetime.datetime.strptime(args.before[0], format)
break
except ValueError:
pass
else:
print 'time data %s does not match format' % args.before[0]
exit(1)发布于 2014-08-02 16:07:25
我会做这样的事情:
def validate_date(datestr):
for format in ("%Y-%b-%d", "%Y-%b", ...):
try:
return datetime.datetime.strptime(datestr, format)
except ValueError:
pass
else:
print 'time data %s does not match format' % datestr
exit(1)然后:
BEFORE = validate_date(args.before[0])如果循环在没有else或return的情况下到达终点,那么for循环上的break块就会运行,在这种情况下,只有当没有format成功地解析datestr时,才会发生这种情况。
如果像@poke一样,您希望函数不是exit整个脚本(可能并不总是合适的),则可以从函数中完全删除exit(1) (因此,如果没有format匹配,这将隐式地删除return None ),并执行以下操作:
BEFORE = validate_date(args.before[0])
if BEFORE is None:
exit(1)您也可以将整个else块移出函数之外,因为您可能也不总是希望它成为print。
https://stackoverflow.com/questions/25096897
复制相似问题