strptime()无法解析calendar.month_name的迭代

时间:2012-07-26 18:19:41

标签: python for-loop strptime

这里看起来有些愚蠢:datetime.strptime()很高兴接受一个月份名称的迭代列表,当我只是手工创建一个列表(months = ['January','February'])而不是当我迭代一个列表由calendar.month_name创建的月份,即使两者都返回<type 'str'>

代码破碎:

import datetime
import calendar
for month in calendar.month_name:
    print datetime.datetime.strptime(month,"%B")

错误: ValueError: time data '' does not match format '%B'

工作代码:

import datetime
months = ['January','February','March']
for month in months:
    print datetime.datetime.strptime(month,"%B")

结果:

1900-01-01 00:00:00
1900-02-01 00:00:00
1900-03-01 00:00:00

这里发生了什么?这是我不熟悉的python for循环的行为吗?

2 个答案:

答案 0 :(得分:4)

尝试print( list(calendar.month_name) ),很快就会明白为什么会失败...(主要是因为产生的第一个元素是一个空字符串)。请注意,第一个月产生的字符串是空字符串的原因是因为他们希望month_names[1]January对应,这是常见约定(请参阅documentation

可以做这样的事情:

a = list( calendar.month_names )[1:]

或者这也至少在Cpython中有效(尽管文档中不清楚它是否应该):

a = calendar.month_names[1:]

答案 1 :(得分:1)

作为noted by mgilson,返回的第一个项目是空字符串。忽略它是微不足道的:

for month in calendar.month_name:
    if month:
        print datetime.datetime.strptime(month,"%B")

或者使用列表推导来删除它:

for month in [month_name for month_name in calendar.month_name if month_name]:
    print datetime.datetime.strptime(month,"%B")