time.strptime() python3 最好的使用方法?
time.strptime() python3 best way to use it?
我基本上是在尝试检查一些用户输入。用户必须输入正确的日期
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
这行得通吗?
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。
如果正则表达式失败,匹配 returns None
和 None.groups()
引发 AttributeError
。如果数字不是有效的年、月、日元组,则 datetime.date(y,m,d)
引发 ValueError
.
您的时间格式不正确。您应该使用 %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)
如果您想支持更复杂的命令行参数,例如,添加可选参数,然后使用 argparse
or docopt
模块提供的命令行解析器。
我基本上是在尝试检查一些用户输入。用户必须输入正确的日期
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
这行得通吗?
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。
如果正则表达式失败,匹配 returns None
和 None.groups()
引发 AttributeError
。如果数字不是有效的年、月、日元组,则 datetime.date(y,m,d)
引发 ValueError
.
您的时间格式不正确。您应该使用 %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)
如果您想支持更复杂的命令行参数,例如,添加可选参数,然后使用 argparse
or docopt
模块提供的命令行解析器。