【问题标题】:Python inFile with loop带有循环的 Python inFile
【发布时间】:2013-02-15 23:52:17
【问题描述】:

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

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

【问题讨论】:

  • “试图使用 inFile”是什么意思?是否有一些名为“inFile”的库或程序,或者你只是说你想命名你的变量或其他东西? (另外,我看到您已将“infile”添加为标签,但该标签没有任何描述。)
  • 同时,永远不要说“不断返回那个 avg 是无效的语法”。向我们展示实际的SyntaxError,并带有回溯。
  • N 个数字的平均值(或算术平均值)是 sum(numbers)/N 而不是 float(int(number[0]* .3 + number[1]* .1 + number[2]* .6)),如果有的话,它是某种加权平均值(或平均值)。

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


【解决方案1】:

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

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

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

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

当您在一条看起来完美无缺的线上获得SyntaxError 时,有两个好方法可以尝试。

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

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


一旦你通过了这个,你会得到一个ValueError,因为你试图在你从readline返回的三个字符串的list上调用int。那是行不通的;你必须打电话给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 — 将整数乘以 0.3 就可以了。如果要保留任何小数部分,则不需要int。所以,只使用一个或另一个。

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

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

number[0]* .3 + number[1]* .1 + number[2]* .6 的结果是 float,就像 George 的 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.")

但是无论你想用 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()

【讨论】:

  • 您的评论对我找出所有错误帮助很大,谢谢!
【解决方案2】:

编辑***最后我想通了。我的代码没有工作的原因有很多,主要是 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 2013-07-18
    • 2017-07-11
    • 2019-01-30
    • 1970-01-01
    • 2013-01-25
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多