错误:列表索引超出范围

时间:2013-12-03 00:39:00

标签: python

我正在使用CSV文件,这是我到目前为止所拥有的。我得到一个错误,我的索引超出了范围。它完成了第一个for循环然后搞砸了。我正在尝试填写字典。

def read_table(file):
    line = file.readline()
    line = line.strip()
    keylist = line.split(',')
    d = {}
    for key in keylist:
        if key not in d:
            d[key] = []
    while line != '':
        line = file.readline()
        line = line.strip()
        val = line.split(',')
        for i in keylist:
            index = keylist.index(i)
            d[keylist[index]].append(val[index])
    return d

1 个答案:

答案 0 :(得分:2)

while循环在line变空时不会中断,它只是在每个循环开始时检查它。

所以,当你读完除最后一行以外的所有内容时,你会这样做:

while line != '': # the last line wasn't empty
    line = file.readline() # but now this one is
    line = line.strip()
    val = line.split(',') # so this returns a single value
    for i in keylist:
        index = keylist.index(i) # so this raises an IndexError
        d[keylist[index]].append(val[index])

最小修复是在每个readline之后直接进行检查:

while True:
    line = file.readline()
    line = line.strip()
    if not line:
        break
    val = line.split(',') # so this returns a single value
    for i in keylist:
        index = keylist.index(i) # so this raises an IndexError
        d[keylist[index]].append(val[index])

(请注意,如果文件中间有空行,您将提前返回而不是引发错误,因为您在line之后检查line = line.strip(),所以您不能更长时间区分空行'\n'和文件结束''。如果这是一个问题,只需将测试向上移动一行。)

更好的修复方法是迭代文件:for line in file:完全按照您希望循环执行的操作,而不必处理readline并检查空字符串和break来自循环等等。

更好的修复方法是使用csv模块让它做它的工作:

d = defaultdict(list)
reader = csv.DictReader(file)
for line in reader:
    for key, value in line.items():
        d[key].append(value)
return d

或者,或者,只需构建一个dicts列表(您可以使用list_o_dicts = list(reader)),然后将其转换为最后列表的dict。