2016-03-24 79 views
2

我想編寫一個程序,讀取CSV學生的分數列表,並執行以下操作:CSV編程讀寫

程序計算考試平均爲每個學生和其四捨五入爲整數的使用數學然後它將名稱和考試平均數寫入另一個csv文件,名爲examScores.csv最高分5分內的學生姓名和分數,例如,如果最高分爲98分,則所有打分> = 93的學生都應該打印。
在0-59,60-69,70-79,80-89,90-100範圍內得分的學生人數(爲了追蹤範圍,你應該設置一個大小爲5的計數器列表;當你在第一個範圍內處理一個數字時,你更新位置0,在第二個範圍內,位置1等等)。

我對此很難過。這是到目前爲止,我炮製代碼:

inpt1=open("grades.csv","r") 
outpt1=open("examscores.csv","w") 
studentname=[] 
studentlastname=[] 
gradeav=[] 
highav=0 
inpt1.readline() 

for line in inpt1: 
    data=line.split(",") 
    averages=math.ceil(data[2])+float(data[3])/2 
    studentname.append(data[0]) 
    studentlastname.append(data[1]) 
    gradeav.append(averages) 
inpt1.close() 
outpt1.close() 

我不能讓數學小區功能的工作和我的追加不工作爲好。當然,我不希望任何人爲我解決這個問題,只需要一個提示或推動正確的方向。

+0

我建議看看涵蓋正確打開和讀取csv文件的線程,將這些數據保存到列表中,並在列表上進行平均。代碼中有幾處錯誤,所有這些都在這裏的全部3個例子中進行了解釋。使用字典列表來存儲數據可能會更容易,但如果太複雜,您可以在技術上堅持使用一堆單獨的列表。 – Chris

回答

0

既然你是在尋求一個提示,我會給它一個機會。

請注意,您是單獨記錄名稱和成績。更有用的是將這些值記錄在一個連貫的數據結構中。我更喜歡列表的列表。從

records = [] 

跟隨與文件讀取,行分割和值提取。然後將其插入記錄。

records.append([average, last_name, first_name]) 

在循環結束時,按第一列按降序對記錄進行排序。提示:谷歌「列表排序lambda的Python列表」。從排序列表中挑選最大值和它下面的5個點。我會把它作爲你的練習。

您也可以使用排序後的列表來拆分不同的範圍。提示:谷歌「python bisect包」。

至於與math.ceil您的問題,嘗試

average = math.ceil(0.5* (float(data[2]) + float(data[3]))) 

讓我知道,如果需要更多的提示。 :-)