2016-02-14 70 views
1

Python 3.5.1 我正在創建一個對文本文件進行排序的程序。該程序應該重寫文本文件,以保留每個學生只有三個最新的分數。我目前在文本文件中有'Aum Patel'的4個分數;我希望Python在讀取之前刪除最早的分數版本。該文本文件如下 - >「名」,「分」如何使用python刪除文本文件的一行

這是文本文件(它被稱爲「測驗-1」):

Aum Patel,10 
Guy,9 
Aum Patel,8 
Amanjeet Singh,2 
Aum Patel,4 
Aum Patel,10 
Chong Singh,1 
Amanjeet Singh,7 

這是Python 3代碼:

import csv 
import operator 

n=0 
quizGrades = open('Quiz-1.txt' , 'r') 

grades = csv.reader(quizGrades, delimiter =',') 
sortedGrades = sorted(grades, reverse= False, key=operator.itemgetter(0)) 
person=[] 
SCORE=[] 
for eachline in sortedGrades: 
    person.append(eachline[0]) 
    SCORE.append(eachline[1]) 
    print(person[n],': scored ',SCORE[n]) 
    print() 
    n=n+1 
    quizGrades.close() 
+1

哪一個是最古老的......? – poke

+0

爲什麼你不想讓舊的分數被讀取?你怎麼知道哪個更老? – hilcharge

+0

我想要閱讀更新的。最新的成績排在最前面 –

回答

1

爲了跟蹤各個學生,我建議使用字典來存儲所有內容。然後每個條目將包含他們所有分數的列表。

因此,首先閱讀測驗文件,並建立字典。然後遍歷所有從每個寫出了最後3項如下到新的文件:

import csv 

d_students = {} 

with open('input.txt', newline='') as f_input, open('output.txt', 'w', newline='') as f_output: 
    csv_input = csv.reader(f_input) 
    csv_output = csv.writer(f_output) 

    for student, score in csv_input: 
     if student in d_students: 
      d_students[student].append(int(score)) 
     else: 
      d_students[student] = [int(score)] 

    for student, scores in d_students.items(): 
     scores = scores[-3:] # Take the last 3 scores in each list 
     print("Student {} has an average score of {:.1f}".format(student, sum(scores)/float(len(scores)))) 

     for score in scores: 
      csv_output.writerow([student, score]) 

對你有d_students數據將持有如下:

{'Guy': ['9'], 'Amanjeet Singh': ['2', '7'], 'Chong Singh': ['1'], 'Aum Patel': ['10', '8', '4', '10']} 

的平均值由求和的得分和每個列表中由分數的總數除以計算,這將顯示以下輸出:

Student Amanjeet Singh has an average score of 4.5 
Student Chong Singh has an average score of 1.0 
Student Aum Patel has an average score of 7.3 
Student Guy has an average score of 9.0 

從這裏,腳本輸出的升AST從每個列表條目3給你以下輸出文件:

Chong Singh,1 
Guy,9 
Amanjeet Singh,2 
Amanjeet Singh,7 
Aum Patel,8 
Aum Patel,4 
Aum Patel,10 

請注意,如果您使用的csv與Python 3,您需要使用newline=''參數來打開該文件。

+0

分數[-3:]的分數線會爲你做到這一點。這最多佔用每個學生成績列表中的最後3個條目。如果你運行這個腳本,它會爲你創建一個名爲'output.txt'的新文件,其中只有每個學生的最後3個條目。使用字典時,學生的排序可能會改變,但分數將保持有序。 –

+0

它打印出最接近文件底部的條目。如果你想讓離文件頂部最近的那個更改'[-3:]'到'[:3]'。我建議您將測試文件更改爲不同的數字,例如讓第一個輸入說15,然後你會看到哪些包含在輸出中。目前你有兩個10個,所以你不知道哪個是哪個。 –

+0

如果我想找出每個學生的平均分數(來自三個分數),我該怎麼辦? –

相關問題