首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:匹配正确的datetime.datetime格式

Python:匹配正确的datetime.datetime格式
EN

Stack Overflow用户
提问于 2014-08-02 16:03:08
回答 3查看 283关注 0票数 0

在我的Python脚本中,我传递带有--before参数的命令行选项date,即

代码语言:javascript
复制
myscript.py --before 2014-Aug-02

然后我需要把它读入我的变量中。我想支持几种可能的日期格式,即2014-Aug-022014-08-022014-08,.

在我的脚本中,我有下面的构造来尝试匹配提供的日期格式,但在我看来它非常难看。有更好更优雅的方法吗?

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-02 16:06:23

我亲自使用 package解析任意日期:

代码语言:javascript
复制
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解析器可以处理您想要支持的所有格式以及更多的格式。

但是,如果不希望安装外部依赖项,则创建支持的格式列表,并使用循环:

代码语言:javascript
复制
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:套件。

票数 4
EN

Stack Overflow用户

发布于 2014-08-02 16:07:54

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2014-08-02 16:07:25

我会做这样的事情:

代码语言:javascript
复制
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)

然后:

代码语言:javascript
复制
BEFORE = validate_date(args.before[0])

如果循环在没有elsereturn的情况下到达终点,那么for循环上的break块就会运行,在这种情况下,只有当没有format成功地解析datestr时,才会发生这种情况。

如果像@poke一样,您希望函数不是exit整个脚本(可能并不总是合适的),则可以从函数中完全删除exit(1) (因此,如果没有format匹配,这将隐式地删除return None ),并执行以下操作:

代码语言:javascript
复制
BEFORE = validate_date(args.before[0])
if BEFORE is None:
    exit(1)

您也可以将整个else块移出函数之外,因为您可能也不总是希望它成为print

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25096897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档