&引用;TypeError:列表索引必须是整数,而不是str";在Python2.7中

&引用;TypeError:列表索引必须是整数,而不是str";在Python2.7中,python,csv,type-conversion,data-analysis,Python,Csv,Type Conversion,Data Analysis,我目前正在修一门关于Udacity的数据分析课程。我的日子有点不好过。我有,我目前正在尝试转换一些字典中的一些数据类型,我不断得到错误“TypeError:列表索引必须是整数,而不是str”现在,它说这是一个列表,但据我所知,我所有的数据都在字典中。这是密码 # Lesson 1 - Data Analysis # Get & Open Data import unicodecsv import datetime as dt def openCSV(filename): wit

我目前正在修一门关于Udacity的数据分析课程。我的日子有点不好过。我有,我目前正在尝试转换一些字典中的一些数据类型,我不断得到错误“TypeError:列表索引必须是整数,而不是str”现在,它说这是一个列表,但据我所知,我所有的数据都在字典中。这是密码

# Lesson 1 - Data Analysis
# Get & Open Data
import unicodecsv
import datetime as dt

def openCSV(filename):
    with open(filename, "rb") as f:
        reader = unicodecsv.DictReader(f)
        return list(reader)

def parse_date(date):
    if date == '':
        return None
    else:
        return dt.strptime(date, "%y-%m-%d")
def parse_int(i):
    if i == '':
        return None
    else:
        return int(i)

enrollments = openCSV("enrollments.csv")

for enrollment in enrollments:
    enrollments['cancel_date'] = parse_date(enrollments['cancel_date'])
    enrollments['days_to_cancel'] = parse_int(enrollments['days_to_cancel'])
    enrollments['is_canceled'] = enrollments['is_canceled'] == 'True'
    enrollments['is_udacity'] = enrollments['is_udacity'] == 'True'
    enrollments['join_date'] = parse_date(enrollments['join_date'])

# daily_engagement = openCSV("daily_engagement.csv")
# project_submissions = openCSV("project_submissions.csv")

enrollments[0]
以下是文件内容的示例,它位于前两行:

account_key,status,join_date,cancel_date,days_to_cancel,is_udacity,is_canceled
448,canceled,2014-11-10,2015-01-14,65,True,True

在for循环中,您通过迭代注册来获得注册,但您尝试访问注册密钥而不是注册密钥

for enrollment in enrollments:
    enrollment['cancel_date'] = parse_date(enrollment['cancel_date'])
    enrollment['days_to_cancel'] = parse_int(enrollment['days_to_cancel'])
    enrollment['is_canceled'] = enrollment['is_canceled'] == 'True'
    enrollment['is_udacity'] = enrollment['is_udacity'] == 'True'
    enrollment['join_date'] = parse_date(enrollment['join_date'])
此外,还可以简化助手功能:

def parse_date(date):
    return dt.strptime(date, "%y-%m-%d") if date else None

def parse_int(i):
    return int(i) if i else None

你打错了。它应该是
注册['cancel_date']
而不是
注册['cancel_date']

openCSV的最后一行将您的数据转换为列表,不是吗?试着返回
reader
我以为行
reader=unicodecsv.DictReader(f)
将数据转换为字典。主要是因为您无法使用字符串访问列表中的项目@SimonFraseri在for循环中,您通过迭代注册来获得注册,但是您尝试访问注册密钥而不是注册密钥。您可以在每次迭代中简单地打印出
注册
,以验证您的假设。您还可以包括完整的堆栈跟踪,以准确地向我们显示引发错误的位置。如果你能检查并知道,为什么要猜测和假设?哦,这是一个伟大的观点@Apero!我会试试的。所以,我修改了它,它返回了一个字典而不是一个列表,并使用了上面的代码。不过我有一个新的错误。ValueError:字典更新序列元素#0的长度为7;2是必需的不要改变你建立注册的方式,只要删除“s”就行了我也试过了,它给我的错误和我开始时一样,类型错误:列表索引必须是整数,而不是str。