这里看起来有些愚蠢: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
循环的行为吗?
答案 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")