-1

我正在尝试使用 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 

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

4

2 回答 2

3

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

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

你有四个(s,但只有三个)s。

因此,Python 期望表达式在下一行继续,但它看到一个=不能出现在表达式中间的 ,所以它引发了一个SyntaxError

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

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

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


一旦你超过了那个,你就会得到 a ValueError,因为你试图调用你从 回来的三个字符串中int的 a 。那是行不通的;你必须打电话给每一个。所以,而不是这个:listreadlineint

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此处-将整数乘以 0.3 就可以了。如果要保留任何小数部分,则不需要int. 因此,只需使用其中一种。

你在下一行做同样的事情:

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

的结果number[0]* .3 + number[1]* .1 + number[2]* .6float,例如89.1George。然后,您将其转换为int,这将为您提供89. 然后,您将其转换回float,得到89.0. 我无法想象这就是你想要的——你可能想要 unconverted 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.")

但是无论你想做什么,0而且len(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()
于 2013-02-16T00:20:15.147 回答
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()
于 2013-02-22T05:36:20.043 回答