【问题标题】:"TypeError: list indices must be integers, not str" in Python 2.7 [closed]Python 2.7 中的“TypeError:列表索引必须是整数,而不是 str”[关闭]
【发布时间】:2016-05-23 20:23:41
【问题描述】:

我目前正在学习 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

【问题讨论】:

  • openCSV 的最后一行将你的数据转换成一个列表,不是吗?尝试只返回reader
  • 我认为reader = unicodecsv.DictReader(f) 行将数据转换为字典。主要是因为您无法使用字符串访问列表中的项目。 @西蒙弗雷泽
  • 在您的 for 循环中,您通过迭代注册来获得注册,但您尝试访问注册键而不是注册键
  • 您可以简单地在每次迭代中打印出enrollment 来验证您的假设。您还可以包含完整的堆栈跟踪,以准确地向我们展示引发错误的位置。如果您可以检查并知道,为什么还要猜测和假设?
  • 哦,这很好@Apero!我会试试的。

标签: python csv type-conversion data-analysis


【解决方案1】:

在您的 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

【讨论】:

  • 所以,我对其进行了更改,使其返回字典而不是列表并使用上面的代码。我得到了一个新的错误。 ValueError:字典更新序列元素 #0 的长度为 7; 2 是必需的
  • 不要改变你建立注册的方式,只需像我一样删除“s”
  • 我也试过了,它给了我和我一开始一样的错误,TypeError: list indices must be integers, not str.
【解决方案2】:

你有一个错字。应该是enrolment['cancel_date'] 而不是enrolments['cancel_date']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2014-09-02
    相关资源
    最近更新 更多