2014-05-15 93 views
-1

我正在嘗試編寫一個讀取3類數據文件(如period1.txt,period2.txt)的程序。這些文件裏面有3個不同學生的名字,姓氏和3個考試成績。使用python讀取和寫入數據文件

數據文件的格式是這樣的

Meagan. Hesse. 99. 99. 99 

我的程序,然後想採取平均分配檔次和寫在另一個TXT文件夾中的結果,也是學生的名字,如period1cgrade和period2grade

我已經試過固定的一些問題,但它看起來像它仍處於進展中的工作,我不知道是否我打開數據文件的權利,你可以看看這部分

def calcaverage(test1,test2,test3): 
    for count in range(test1,test2,test3): 
     curraverage=0 
     curraverage=((test1[count]+ test2[count]+ test3[count])/3) 
     currentaverage.append(curraverage) 
     if curraverage>= 90: 
      grade= "A" 
      lettergrades.append(grade) 
     elif curraverage >= 80 and curraverage < 90: 
      grade= "B" 
      lettergrades.append(grade) 
     elif curraverage >= 70 and curraverage < 80: 
      grade= "C" 
      lettergrades.append(grade) 
     elif curraverage < 70: 
      grade= "F" 
      lettergrades.append(grade) 

name=[] 
test1=[] 
test2=[] 
test3=[] 
averagescore=[] 
lettergrades=[] 



with open ("period1.txt", 'r') as infile: 
    for line in infile: 
     values = line.split() 
     name.append(values[0] + ','+ values[1]) 
     for line in infile: 
      values = line.split() 
      score1=float(values[2]) 
      test1.append(score1) 
      for line in infile: 
       values = line.split() 
       score2=float(values[3]) 
       test2.append(score2) 
       for line in inline: 
        values = line.split() 
        score3=float(values[4]) 
        test3.append(score3) 
averagescore=calcaverage(test1,test2,test3) 

print(line) 
+2

所以到底這個代碼不工作? –

+0

你需要學習如何調試你的代碼。就我個人而言,我更喜歡附加一個調試器,一次一行地遍歷代碼並檢查變量以查看發生了什麼。其他更喜歡使用'print()'和類似的方法來顯示代碼進展中的變量。沒有更多信息,我們將無法爲您提供很多幫助。至少,我們需要知道任何錯誤,得到的輸出等等。知道例如從文件中讀取了多少行,循環是否運行正確的次數也是有幫助的,等 – Basic

+0

你不應該像上面做的那樣多次迭代同一個對象(在for循環中使用它)。 「對於infile行」被多次調用。 TBH,我從來沒有這樣做過,我不確定它在幕後做了什麼。我的猜測是這代表三個輸入文件,或者應該是。 – jaime

回答

0

這是我如何會做到這一點:

FILENAMES = [("period1.txt", "period1grade.txt"), ... ] 

for inpath, outpath in FILENAMES: 
    with open(inpath) as infile, open(outpath, 'w') as outfile: 
     for line in infile: 
      if line: 
       first, last, grades* = map(str.strip,line.split('.')) 
       grades = map(int, grades) # maybe float? 
       output = "{}. {}. {}\n".format(first, last, sum(grades)/len(grades) 
       outfile.write(output) 

我現在明白,你必須指定一個字母等級,所以像你一樣爲

def getlettergrade(grades): 
    """Returns a letter grade ["A","B","C","F"] given a list of ints as grades of 100""" 
    percent = sum(grades)/len(grades) 
    if grade >= 90: return "A" 
    elif grade >= 80: return "B" 
    elif grade >= 70: return "C" 
    else: return "F" 
我會做準確,單獨寫一個函數
1

有人已經提交了答案,但是這是在我看來,做你想要的最徹底的方法...

marks = {90:'A', 80:'B', 70:'C', 0:'F'} 
grades = {} 

def calc_grades(infile): 
    with open(infile, 'r') as f: 
     for line in f.read().splitlines(): 
      fname, lname, g1, g2, g3 = line.split('. ') 
      avg = sum(map(float, [g1, g2, g3]))/3 
      name = "%s %s" % (fname, lname) 
      grades[name] = marks[min(marks.keys(), key=lambda k: abs(k-avg) if avg>=k else 100)] 

def put_grades(outfile): 
    with open(outfile, 'w+') as f: 
     f.writelines(["%s: %s\n" % (k, v) for k, v in grades.items()]) 

if __name__ == "__main__": 
    calc_grades('period1.txt') 
    put_grades('p1_grades.txt') 

編輯:固定的lambda表達式