我试图用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
对此有任何帮助将不胜感激。我不知道该怎么做。
答案 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
,或者可能希望截断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.")
但无论你想用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()
答案 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()