2

我有以下输入:

ID,       Last,      First,   Lecture, Tutorial, A1,  A2, A3,   A4,  A5
10034567, Smith,     Winston, L01,     T03,      6,   5.5, 8,   10,  8.5
10045678, Lee,       Bruce,   L02,     T05,      4.5, 6.5, 7,   7,   8.5
00305678, Obama,     Jack,    L01,     T05,      10,  10,  9,   9.5, 10
00567890, Brown,     Palin,   L02,     T03,      4,   7.5, 6.5, 0,   5
10012134, Harper,    Ed,      L01,     T03,      10,  9,   7.5, 10,  6.5
10014549, Johnson,   Andrew,  L01,     T05,      10,  0,   10,  5.5, 7
10020987, Clockwork, Milan,   L02,     T03,      10,  8.5, 8,   9,   9
10021234, Freeman,   Skyski   L01,     T02,      0,   10,  10,  10,  8.5
EOF

文件的第一行解释了每一列数据。设 n 为学生总数,则文件的下 n 行每行对应班级中的一名学生,并包含 10 个字段:

  1. 学生卡

  2. 讲座部分

  3. 教程部分

  4. 作业 1 的成绩(等等......)

假设成绩存储在一个文件中,grades.txt那么您可以使用以下 Python 语句将文件的整行读入 Python 字符串 s:

file = open (‘grades.txt’, ‘r’)
s = file.readline()

您只需打开文件一次,然后您可以readline()多次使用该功能,每次读取连续的一行。在学生记录的 n 行之后,文件以最后一行表示EOFshort for结束End of File

数字 n 不是已知的优先级。样本输入无关紧要,它可以包含 100 到 300 名学生,在一个名为grades.txt“我们希望最终为作业 1 的成绩分布绘制直方图”的文件中。因此,您需要通过处理他/她来提取每个学生的 A1 成绩文件中的对应行。构建一个列表,每个学生都有一个条目,存储他/她的 A1 成绩。每次提取新的 A1 成绩时,将其附加到此列表中。

到目前为止,这就是我所做的:

file = open('grades.txt','r')
s = file.readline()


for line in file:
    newline = str(line)
    grades = newline.split(",")
    if len(grades)<=4:
        break
    elif len(grades)>5:
        break
    else:
        grades = [float(x) for x in grades]
gradeA1 = grades[5]
print(gradeA1)

但是,我只得到第一级6而不是任何连续行的其他 A1 成绩,所有 A1 成绩都应该汇总到一个列表中。

我有这个作为我编辑的代码,但我仍然得到一个错误。

file = open('grades.txt','r')
s = file.readline()

for s in file:
    s = file.readline()
    grades = s.split(",")
    if grades=='EOF\n':
        break
A1grades = [float(x) for x in grades[5]]   
print(A1grades)

我得到一个索引超出范围错误。

4

3 回答 3

1

对于任何格式良好的数据,csv 模块是一个很好的起点——我建议您阅读相关文档,然后尝试一下。应该让你朝着正确的方向前进。否则,我怀疑您对列表的内容有些混淆 - 最近一行的结果列表或行列表。该代码当前在每一行上重新创建成绩,这可能不是您想要做的......

于 2012-11-08T19:38:17.590 回答
1

我认为问题可能是你没有从文件中读取所有行......也许你可以做这样的事情

firstLine = file.readline()
#extract from first line, the number of lines that next

for x in range(1,number_of_line)
    line = file.readline()
    #process the information for all next lines

这是一种方法,希望这可以帮助你......

于 2012-11-08T20:05:35.993 回答
1

我可能弄错了,但是,有了这个输入:

ID,       Last,      First,   Lecture, Tutorial, A1,  A2, A3,   A4,  A5
10034567, Smith,     Winston, L01,     T03,      6,   5.5, 8,   10,  8.5
10045678, Lee,       Bruce,   L02,     T05,      4.5, 6.5, 7,   7,   8.5
00305678, Obama,     Jack,    L01,     T05,      10,  10,  9,   9.5, 10

这个(部分)代码:

for line in file:
    newline = str(line)
    grades = newline.split(",")
    if len(grades)<=4:
        break
    elif len(grades)>5:
        break

只有当正好有 5 列时,您才会继续循环。我数了 10 列(用逗号分隔)。因此,您在第一行之后立即中断(也不要将成绩转换为浮点数),并且只从第一行获取结果。

您的代码中还有其他几个错误,但您可能需要先修复它。

顺便说一句,我假设这是来自 Python 课程(看到你问题中的措辞),所以我认为你只是在学习基础知识。如果没有,或者您想做得更好,我会选择 KevinL 并使用CSV 模块

编辑

从新代码(在编辑的问题中):

  1. 您不必检查EOF. 循环遍历文件 ( for s in file) 为您完成此操作。

  2. for s in file已经读了一行。没必要s = file.readline()再来了。

  3. 对于每条分割线,找到成绩。将此附加到您在开始时创建(空)的不同列表中。此列表包含您的 A1 成绩。

    Grades = [] for s in file: columns = s.split(",") grades.append(columns[5])

但是:我认为您需要退后一步,非常仔细地编写您的代码正在做什么(或我的代码),或者需要做什么(不是在代码中,而是在文字中,一步一步地)。在编程方面(甚至不是 Python 方面),你缺少很多东西。

如果这是家庭作业,也许最好与其他做这件事的人讨论。此外,还有Python 导师邮件列表,可能更适合。

无意冒犯,只是想提供一些实用的建议。

于 2012-11-09T10:07:54.047 回答