我有以下输入:
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个字段:
学生证
姓氏
名字
讲座部分
教程sectiom
作业1 的等级(依此类推......)
假设成绩存储在文件grades.txt
中,那么您可以使用以下Python语句将整行文件读入Python字符串:
file = open (‘grades.txt’, ‘r’)
s = file.readline()
您只需要打开一次文件,然后就可以多次使用readline()
功能,每次都读取一行。在n行学生记录之后,该文件以最后一行结束,该行显示EOF
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)
我的索引超出范围错误。
答案 0 :(得分:1)
对于任何格式良好的数据,csv模块是一个很好的起点 - 我建议你阅读一下这个文档,然后试一试。应该让你朝着正确的方向前进。否则,我怀疑你对你的列表有什么困惑 - 最近一行的结果列表或行列表。代码目前在每一行重新创建成绩,这可能不是你想要做的......
答案 1 :(得分: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
这是一种方法,希望这可以帮助你......
答案 2 :(得分: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 module。修改强>
从新代码(在编辑的问题中):
您无需检查EOF
。循环浏览文件(for s in file
)会为您做到这一点。
for s in file
已经读了一行。无需再次s = file.readline()
。
对于每条分割线,找到等级。将其附加到您在开始时创建(空)的不同列表。此列表包含您的A1等级。
成绩= [] 对于文件中的s: columns = s.split(“,”) grades.append(列[5])
但是:我认为你需要退一步,仔细写下你的代码正在做什么(或我的代码),或者需要做什么(不是在代码中,在文字中,一步一步)。有很多你缺少,编程明智(甚至不是Python)。
如果这是家庭作业,也许最好与其他人一起讨论。此外,还有Python tutor mailing list,可能更适合。
没有冒犯,只是想提供一些实用的建议。