Python calendar.month_name的迭代可以';无法被strtime()解析

Python calendar.month_name的迭代可以';无法被strtime()解析,python,for-loop,strptime,Python,For Loop,Strptime,这里有一个似乎有点愚蠢的东西:datetime.strtime()很乐意接受一个月名的迭代列表,当我只是手工创建一个列表(months=['一月','二月'])时,但当我迭代一个由日历创建的月名列表时,就不会了。month\u name,即使两者都返回 破译代码: import datetime import calendar for month in calendar.month_name: print datetime.datetime.strptime(month,"%B") 错

这里有一个似乎有点愚蠢的东西:
datetime.strtime()
很乐意接受一个月名的迭代列表,当我只是手工创建一个列表(
months=['一月','二月']
)时,但当我迭代一个由
日历创建的月名列表时,就不会了。month\u name
,即使两者都返回

破译代码:

import datetime
import calendar
for month in calendar.month_name:
    print datetime.datetime.strptime(month,"%B")
错误:
ValueError:时间数据“”与格式“%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
循环的行为吗?

尝试执行
打印(list(calendar.month_name))
,很快就会明白这失败的原因。。。(主要是因为生成的第一个元素是空字符串)。请注意,生成的第一个月是空字符串的原因是,他们希望
月份名称[1]
一月
对应,这是常见的约定(请参阅)

你可以这样做:

a = list( calendar.month_names )[1:]
或者这至少在Cpython中也有效(尽管文档中不清楚是否应该):

尝试执行
print(list(calendar.month\u name))
后,很快就会明白为什么失败了。。。(主要是因为生成的第一个元素是空字符串)。请注意,生成的第一个月是空字符串的原因是,他们希望
月份名称[1]
一月
对应,这是常见的约定(请参阅)

你可以这样做:

a = list( calendar.month_names )[1:]
或者这至少在Cpython中也有效(尽管文档中不清楚是否应该):

因为返回的第一项是空字符串。忽略它是微不足道的:

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")
因为返回的第一项是空字符串。忽略它是微不足道的:

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")

谢谢你给我指明了正确的方向!它看起来像是以索引1开始循环(
表示日历中的月份。月份名称[1:::::
)也可以工作。太好了@wire42--是的,我也意识到了这一点(经过一些实验)。文档中使用了术语
array
,这对于返回类型来说有点含糊不清。但它似乎是可以切片的(至少在Cpython),谢谢你为我指明了正确的方向!它看起来像是以索引1开始循环(
表示日历中的月份。月份名称[1:::::
)也可以工作。太好了@wire42--是的,我也意识到了这一点(经过一些实验)。文档中使用了术语
array
,这对于返回类型来说有点含糊不清。但它似乎是可切片的(至少在Cpython中是如此)。Python的
if
(和
for
)语句强大的简单性同时让我感到高兴和紧张。它读起来像是在说“好吧,如果是一个月”,但是当然,
if
不知道是不是一个月。它只是在空字符串上返回false。不过,这是一个相当优雅的解决方案。你认为它比基于切片的解决方案更健壮吗?@wire42,这取决于你所说的“健壮”是什么意思。它当然可以处理将新的空白字符串添加到列表的某个位置或删除的情况,但这种情况不太可能发生。使用切片表示法可能更好地表达了它是一个基于1的数组这一事实。Python的
if
(和
for
)语句的强大简单性让我同时感到高兴和紧张。它读起来像是在说“好吧,如果是一个月”,但是当然,
if
不知道是不是一个月。它只是在空字符串上返回false。不过,这是一个相当优雅的解决方案。你认为它比基于切片的解决方案更健壮吗?@wire42,这取决于你所说的“健壮”是什么意思。它当然可以处理将新的空白字符串添加到列表的某个位置或删除的情况,但这种情况不太可能发生。使用切片表示法可能更好地表示它是基于1的数组这一事实。