索引错误:CSV显示列中的元组索引超出范围。

3

大家好,我是Python的新手,不知道如何解决这个问题。谢谢大家的帮助。

import csv

with open("ict.csv", 'r') as csvFile:
    csvRead = csv.reader(csvFile)
    print(csvRead)

#    for line in csvRead :
 #       print(line)

    header = csvFile.readline().strip().split(',')
    print(header)

    entries = []
    for line in csvFile:

        parts = line.strip().split(',')
        row = dict()
        for i, h in enumerate(header):
            row[h] = parts[i]

#        print(row)

        entries.append(row)

    entries.sort(key= lambda r: r['Gen. Ave.'])

    for e in entries [:12]:
        print('{0}Student No.,Gen. Ave. {10:,}'.format(
            e['Student No.'],e['Gen. Ave.']
        ))

学号 | 平均成绩 | 专业 1 | 90.5 | 计算机科学


1
你的意思是将{10:,}改为{1:,}吗?... - Jon Clements
也许你应该添加一个样本CSV。 - andreihondrari
错误在于 e['学生编号'],e['总平均分'] 部分。 - Jefer Bulan
学生编号 | 平均成绩 | 专业 1 | 90.5 | 计算机科学 - Jefer Bulan
2个回答

1
问题如评论所指出的那样,你的格式说明符之一 - {10:,} - 是错误的。初始的 10 告诉 Python 使用提供给 format 的第 10 个参数,但你只提供了两个,因此出现了 IndexError
实际上,你想要提供元组的第二个元素,即索引为 1 的元素,因此将 {10:,} 更改为 {1:,}。另外,在格式字符串中使用逗号(,)运算符 - 告诉格式化程序使用逗号作为千位分隔符 - 只能用于数字输入。 entries ['Gen. Ave。'] 的值是一个字符串,因为它已经从文件中读取,所以你需要将其转换为数字。这段代码应该可以工作:
for e in entries [:12]:
    print('{0}Student No.,Gen. Ave. {1:,}'.format(
        e['Student No.'], int(e['Gen. Ave.'])
    ))

然而,在您的格式字符串中,位置指示符可以完全删除,因为Python将按照它们编写的顺序将参数应用于格式,因此您可以使用以下内容:
for e in entries [:12]:
    print('{}Student No.,Gen. Ave. {:,}'.format(
        e['Student No.'], int(e['Gen. Ave.'])
    ))

最后,您可以使用csv模块的DictReader类来避免手动为csv中的每一行构建字典。该类会在读取每一行时创建一个字典,使您的代码看起来像这样:

 with open("ict.csv", 'r') as csvFile:
    csvRead = csv.DictReader(csvFile)

    entries = []
    for line in csvRead:
        entries.append(line)

entries.sort(key=lambda r: r['Gen. Ave.'])

for e in entries[:12]:
    print('{}Student No.,Gen. Ave. {:,}'.format(e['Student No.'], int(e['Gen. Ave.'])))

0

首先,您没有使用 csvRead 实例。您应该从它读取而不是从 csvFile 读取。

例如:

我有以下的 something.csv CSV 文件:

76.94,76.944,76.945
76.97,76.979,76.980
77.025,77.025,77.025
77.063,77.264,77.064
77.1,77.64,77.3

现在如果我执行:

import csv

pf = open("something.csv", "r")

read = csv.reader(pf)

for r in read:
    print(r)

pf.close()

您将获得以下输出:
python your_script.py                                                                                                                                                                                  
['76.94', '76.944', '76.945']
['76.97', '76.979', '76.980']
['77.025', '77.025', '77.025']
['77.063', '77.264', '77.064']
['77.1', '77.64', '77.3']

先生,错误在于 e['学生编号'],e['总平均分'] 这一行。 - Jefer Bulan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接