2017-10-16 37 views
1

試圖讓它通過超過3行文本運行,但我現在有兩個行甚至沒有正常工作。爲什麼不循環遍歷我的所有readlines?

文本文件是

74,85,65,56 
97,67,83,96 

這是我一直在努力

file = open('grades.txt','r') 
for x in file: 
    read = file.readline() 
    sep = read.split(",") 
def toNumbers(): 
    changeNum = [eval(x) for x in sep] 
    return changeNum 
def sumlist(): 
    total = 0 
    sum(pls) 
    average = sum(pls)/len(sep) 
    print ("Your average is: ", average) 
def main(): 
    sumlist() 
pls = toNumbers() 
main() 

輸出的代碼應該是

Your average is: 70.0 
Your average is: 85.75 

什麼我得到不僅是

Your average is: 85.75 

當我在一個三線在我的文本文件添加我得到這個錯誤

SyntaxError: unexpected EOF while parsing 

第三行是也只是一個文本文件編號的行可以從那裏

74,85,65,56 
97,67,83,96 
10,20,30,40 

繼續輸出應該是

Your average is: 70.0 
Your average is: 85.75 
Your average is: 25.0 
+0

請註明第三行是什麼。 –

+0

看起來你正在用每一個循環覆蓋'sep'。 –

+0

@EamonnKenny我編輯我的帖子給你,它只是另一行數字。 – kengu

回答

2

我會刪除你的main功能,因爲它是不是真的需要在你的榜樣,並呼籲在toNumberssumlist for循環本身。請注意,您將需要傳遞變量作爲自變量的函數:

def toNumbers(sep): 
    changeNum = [int(x) for x in sep] 
    return changeNum 

def sumlist(pls,sep): 
    average = sum(pls)/len(sep) 
    print ("Your average is: ", average) 


file = open('grades.txt','r') 

lines = file.readlines() 
for line in lines: 
    sep = line.split(",") 

    pls = toNumbers(sep) 
    sumlist(pls,sep) 

這給:

Your average is: 70.0 
Your average is: 85.75 
+0

非常感謝!這看起來比我所做的要簡單得多。我正在研究一些示例供參考,並且認爲它們是我需要的東西,比如'main',如果我使用的是函數。呵呵,我不算太遠? – kengu

+0

@kengu沒問題:) Python是一種重視代碼可讀性的語言。因此,(通常)讀取代碼越容易,越好。如果這能解決您的問題,請不要忘記加註並接受答案。 – DavidG

+0

[This](https://www.python.org/dev/peps/pep-0020/)可能也是有用的:) – DavidG

3

這很簡單。

for x in file: 

已經在你的文件的行迭代,但你忽略了x的值,它是第一線的內容。您只需抓住第二行的內容與你:

read = file.readline() 

添加另一行導致錯誤,因爲你告訴Python來要做的就是for each line in the file, read next line,所以for循環利用每一個奇數行到x然後每個偶數行存儲在read。因此只有具有偶數行的文件纔會被正確處理。
你想擁有這樣的:

for read in file: 
    sep = read.split(",") 

編輯:完整的示例:

def toNumbers(sep): 
    changeNum = [float(x) for x in sep] 
    return changeNum 

def sumlist(sep): 
    total = 0 
    sum(pls) 
    average = sum(pls)/len(sep) 
    print ("Your average is: ", average) 

def main(): 
    file = open('grades.txt','r') 
    for read in file: 
     sep = read.split(",") 
     sep = toNumbers(sep) 
     sumlist(sep) 

main() 
+0

我只得到你的平均值的輸出是:85.75。 – kengu

+0

@ kengu看完整的例子 - 你總是覆蓋'sep'的內容。永遠不要在任何輸入中使用'eval' - 它可以執行任意代碼。 – ElmoVanKielmo

+0

我不明白'sep'有什麼問題嗎?一次分配所有內容會更簡單嗎?如果你能這樣做,但下次我會提防'eval',謝謝! – kengu

1

你有上面甚至沒有在Python對我來說運行的代碼3.但是改變的readline到readlines如下所示完美工作。

lines = file.readlines() 
for line in lines: 
    sep = line.split(",") 
+0

這就是我現在得到的'AttributeError:'列表'對象沒有屬性'split''我試圖拆分readlines前,但它不會爲我工作 – kengu

1

的問題是,因爲你for循環使用file,你在每個步驟中使用file.readline()。這就是爲什麼當你有3條線時顯示錯誤。嘗試添加另一行,4行,它將顯示最後一行。

打印您的readsep會幫助您。 你會注意到使用你的代碼,你只會得到最新的一行,因爲sep分配。

這下面的代碼將實現你想要什麼:

file = open('sample.txt','r') 

raw_lines = file.readlines() 
lines = [raw_line.strip() for raw_line in raw_lines] 


def show_avg_per_line(line): 
    line_list = list(map(int, line.split(","))) 
    average = sum(line_list)/len(line_list) 
    print("Your average is: ", average) 

for line in lines: 
    show_avg_per_line(line) 
+0

這使得很多的感覺,從未去第四行,因爲我對前兩個人感到非常沮喪!我正在打印輸入內容以查看它們的位置,但這隻會讓我更加困惑。謝謝你! – kengu