2013-02-15 84 views
-1

我試圖用python打開一個文件,以便取出文件input.txt的平均值。平均值拍攝完成後,他們則必須顯示每個人的名字後,如Python inFile循環

<student>'s score is <avg> bacons. 

我們還沒有走了過來這個類,所以我真的不知道我在做什麼。我假設我們應該使用一個循環,但我不確定如何實現它。

這是代碼,這使返回該AVG爲無效的語法:

def main(): 
    inFile = open("input.txt","r") 
    numVals = int(inFile.readline()) 
    name = inFile.readline() 
    number = float(int(inFile.readline().split()) 
    avg = float(int(number[0]* .3 + number[1]* .1 + number[2]* .6)) 
    print("name[0 , len(name)]'s Score is",avg,"bacons.") 
    inFile.close() 

main() 

輸入文件包含

5 
Amelia 
90 100 75 
George 
87 90 90 
Adam 
100 80 85 
Jenny 
75 80 90 
Carl 
86 87 88 

任何幫助,在此,將不勝感激。我不知道該怎麼做。

+0

「試圖使用inFile」是什麼意思?是否有一些名爲「inFile」的庫或程序,或者你是否只是想說出你的變量的名稱? (另外,我看到你已經添加了「infile」作爲標籤,但該標籤沒有任何描述。) – abarnert 2013-02-16 00:18:01

+0

同時,永遠不要說「一直返回那個avg是無效的語法」。向我們展示實際的'SyntaxError',帶回溯。 – abarnert 2013-02-16 00:19:10

+0

N個數字的平均值(或算術平均值)是sum(numbers)/ N而不是float(int(number [0] * .3 + number [1] * .1 + number [2] * .6)) '如果有什麼是某種加權平均值(或平均值)。 – martineau 2013-02-16 03:20:12

回答

2

你的第一個問題是這樣的一行:

number = float(int(inFile.readline().split()) 

你有四個( S,但只有3 )秒。

因此,Python期待表達式繼續下一行,但它看到一個=,它不能出現在表達式的中間,因此它會產生一個SyntaxError

當你在看起來非常好的線上看到SyntaxError時,有兩件好事可以嘗試。

首先,打破排隊成小塊,鍵入這些小片放入交互式解釋等

其次,一旦你確定這條線是罰款,看它上面的線和計數括號(括號和大括號)。一個好的編輯器可以更容易地發現 - 或者只需在交互式解釋器中輸入該行;如果你還沒有關閉所有的括號,它會給你一個...而不是>>>,這意味着它正在等待你完成前一行,而不是等待一個完整的新行。


一旦你過去,你會得到一個ValueError,因爲你試圖調用int在您從readline回來一個三list字符串。這是行不通的;你必須在每一個上撥打int。所以,與其這樣:

numbers = float(int(inFile.readline().split())) 

這樣做:

numbers = [float(int(number)) for number in inFile.readline().split()] 

如果你還沒有學會列表理解的是,你必須做一個循環來代替。例如:

numbers = inFile.readline().split() 
for n in range(len(numbers)): 
    numbers[n] = float(int(numbers[n])) 

順便說一句,我不知道你爲什麼在做float(int(…))。如果你想把它們全部截成整數值,你不需要這裏的float-乘以.3的整數就可以了。如果你想保留任何小數部分,你不需要int。所以,只用一個或另一個。

你做下一行同樣的事情:

avg = float(int(number[0]* .3 + number[1]* .1 + number[2]* .6)) 

number[0]* .3 + number[1]* .1 + number[2]* .6結果是float,像89.1喬治。然後你將它轉換成int,這會給你89。然後將其轉換回float,得到89.0。我無法想象這是你想要的 - 你可能想要將未轉換的89.1,或截取的89作爲int,而不是89.0作爲誤導float


此外,你打印出來的東西的方式是非常奇怪的,我不知道它應該做的:

print("name[0 , len(name)]'s Score is",avg,"bacons.") 

這將打印出類似這樣:

name[0 , len(name)]'s Score is 89.0 bacons. 

如果您想打印一個變量的值,不要把它放在引號:

print(name, "'s Score is",avg,"bacons.") 

但是無論你試圖用0len(name) ......好,我不知道你在做什麼,所以我不能解釋如何去做。

無論如何,這將打印:

George 's Score is 89.0 bacons. 

你可能不希望George後的空間,對不對?解決這個問題的最好方法是使用字符串格式化:

print("{}'s Score is {} bacons'".format(name, avg)) 

如果你還沒有了解到的是,說實話,我認爲最好的辦法是隻處理了額外的空間,或者可能改寫句子所以它的不是一個問題:

print(name, 'has a score of', avg, 'bacons.') 

或者,當然,你自己學習之前,老師得到它。這並不複雜。


最後,當你過去,你就只能讀一個名字和號碼的列表,而不是numVals值得他們。要做到這一點,你需要一個循環:

def main(): 
    inFile = open("input.txt","r") 
    numVals = int(inFile.readline()) 
    for i in range(numVals): 
     name = inFile.readline() 
     # ... the rest of your code that happens for each player 
    # ... the code that happens after all the players, like inFile.close() 
+0

你的評論確實幫助我理清了我的所有錯誤,謝謝! – 2013-02-22 05:33:53

0

編輯***我在最後想通了。我的代碼沒有工作原因主要是B/C我不知道縮進是多麼重要

def main(): 

    inFile = open("input.txt","r") 
    numVals = int(inFile.readline()) 


    for i in range(numVals): 

     name = inFile.readline().replace("\n","") 
     numbers = inFile.readline().split() 
     avg = float(numbers[0])*.3 + float(numbers[1])*.1 + float(numbers[2])*.6 
     print(name,'has a final score of',avg) 


    inFile.close() 
main()