2017-10-16 55 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