1

这里有一些看起来有点傻的东西:当我只是手动创建一个列表时很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

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

4

2 回答 2

4

尝试这样做print( list(calendar.month_name) ),很快就会明白为什么会失败......(主要是因为产生的第一个元素是一个空字符串)。请注意,第一个月产生的原因是一个空字符串是因为它们希望按照通用约定month_names[1]进行对应(请参阅文档January

可以这样做:

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

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

a = calendar.month_names[1:]
于 2012-07-26T18:21:59.577 回答
1

正如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")
于 2012-07-26T18:33:54.550 回答