Python inFile with循环

时间:2013-02-15 23:52:17

标签: for-loop python-3.x average load-data-infile

我试图用python打开一个文件,以便从文件input.txt中取出平均值。在取得平均值后,必须在每个人的姓名后显示,例如

<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 

对此有任何帮助将不胜感激。我不知道该怎么做。

2 个答案:

答案 0 :(得分:2)

你的第一个问题是这一行:

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

您有四个(,但只有三个)

因此,Python期望表达式在下一行继续,但它看到=,它不能出现在表达式的中间,因此它会引发SyntaxError。< / p>

当你在一条看起来非常好的线上得到SyntaxError时,有两件好事可以尝试。

首先,将该行分成更小的部分,将这些较小的部分键入交互式解释器等等。

其次,一旦你确定线路正常,看看它上面的线并计算括号(和括号和大括号)。一个好的编辑器可以更容易地发现 - 或者只是在交互式解释器中输入行;如果你还没有关闭所有括号,它会给你一个...而不是>>>,这意味着它等着你完成前一行,而不是等待一个全新的行。< / p>


一旦结束,您将获得ValueError,因为您尝试在int上从list三个字符串调用readline { {1}}。这不起作用;你必须在每一个上拨打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,或者可能希望截断89int,而不是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()

答案 1 :(得分: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()