【问题标题】:time.strptime() python3 best way to use it?time.strptime() python3 最好的使用方法是什么?
【发布时间】:2015-04-16 04:35:41
【问题描述】:

基本上我试图检查一些用户输入。用户必须输入正确的日期

YYYYMMDD

第二个参数必须是正确的系统

MIDRANGE_PROD 或 MIDRANGE_TEST

这是我的代码:

def check_user_args(user_args):
    print(user_args[1])
    if(len(user_args[1]) == 8):
        try:
            time.strptime(user_args[1], '%Y%M%d')
        except ValueError:
            print('Invalid date! ' + user_args[1])
            sys.exit(1)
    else:
        print('Invalid date!')
        sys.exit(1)
    print(user_args[2])
    if(user_args[2] != 'MIDRANGE_PROD' and user_args[2] != 'MIDRANGE_TEST'):
        print('Invalid system! ' + user_args[2])
        sys.exit(1)
    if(len(user_args) > 3):
        print('to many arguments')
        sys.exit(1)

这不是最优雅的方式吗?我有关于使用正则表达式的想法,但是在处理日期时这会很快变得复杂。此外,我似乎无法让 time.striptime 函数正常工作,它仍然需要无效日期

D:\oppssup\old_job>python queue_cleaner_main.py 20151929 MIDRANGE_PROD
['queue_cleaner_main.py', '20151929', 'MIDRANGE_PROD']
20151929
MIDRANGE_PROD

更新:

感谢所有回复。下面是我为python3实现的最终解决方案

# Check command line arguments are correct
def check_user_args(user_args):
    known_systems = {'prod', 'test'}
    try:
        date_string, system_string = sys.argv[1:] #check they only enter 2 arguments
    except ValueError:
        sys.exit('Usage: queue_cleaner <date> <system>')
    try:
        input_date = datetime.strptime(date_string, '%Y%m%d').date() #Check date format ok
    except ValueError:
        sys.exit('expected date in YYYYMMDD format, got: {}'.format(date_string)) #
    if system_string not in known_systems:
        sys.exit('wrong system, expected: {}, got: {}'.format(' or '
                 .join(known_systems), system_string)) # check correct system entered

【问题讨论】:

    标签: validation date python-3.x time command-line-arguments


    【解决方案1】:

    您的时间格式不正确。您应该使用%m(月)而不是%M(分钟)。请参阅文档中的 strftime() and strptime() behavior

    如果您想稍后使用数据,只需解析它并捕获异常:

    #!/usr/bin/env python
    import sys
    from datetime import datetime
    
    known_systems = {'MIDRANGE_PROD', 'MIDRANGE_TEST'}
    
    try:
        date_string, system_string = sys.argv[1:]
    except ValueError:
        sys.exit('Usage: queue_cleaner <date> <system>')
    
    if system_string not in known_systems:
       sys.exit('wrong system, expected: %s, got: %r' % (
           ' or '.join(known_systems), system_string))
    
    try:
        input_date = datetime.strptime(date_string, '%Y%m%d').date()
    except ValueError:
        sys.exit('expected date in YYYYMMDD format, got: %r' % date_string)
    

    如果您想支持更复杂的命令行参数,例如,添加可选参数然后使用命令行解析器,例如由argparsedocopt 模块提供。

    【讨论】:

    • 感谢您的回复。选择此答案,因为它涵盖了所有 3 个案例,但感谢这两个答案
    【解决方案2】:

    这行得通吗?

    import re
    import datetime
    
    def is_valid_date_str(date_str):
        try:
            datetime.date(*map(int, re.match(r"^(\d{4})(\d{2})(\d{2})$", date_str).groups()))
        catch ValueError, AttributeError:
            print('Invalid date! ' + user_args[1])
            sys.exit(1)
    

    try 中的行做了 3 件事:

    • 先用正则表达式将字符串分解成3部分,
    • 然后将捕获的值映射为整数,
    • 然后尝试使用这些值来创建 datetime.date。

    如果正则表达式失败,匹配返回None 并且None.groups() 引发AttributeError。如果数字不是有效的年、月、日元组,则 datetime.date(y,m,d) 引发 ValueError

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 2017-10-18
      • 2018-07-06
      相关资源
      最近更新 更多