【问题标题】:Why doesn't for loop run through all my readlines?为什么 for 循环不遍历我所有的 readlines?
【发布时间】:2017-10-16 19:46:19
【问题描述】:

试图让它运行超过 3 行文本,但我现在的两行甚至都不能正常工作。

文本文件是

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

【问题讨论】:

  • 请说明第三行是什么。
  • 看起来你正在用每个循环覆盖sep。
  • @EamonnKenny 我为你编辑了我的帖子,它只是另一行数字。
  • @AlexPshenko,这是问题的一部分。看我的回答。
  • 并不意味着苛刻。我在开始时做了完全相同的事情,所以你只是在做其他人做的事情。我只是给你一个提示,以避免将来出现此类问题。如果您从文件生成列表,请确保该列表是完全独立的并传递给下一个函数。不要尝试阅读函数之外的内容。这就是我要说的。 DavidG 的回复就是这样做的,这也是为什么他的代码干净且易于理解的原因。

标签: python python-3.x


【解决方案1】:

这很简单。

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()

【讨论】:

  • 我只得到你的平均输出:85.75 仍然。
  • @kengu 查看完整示例 - 您一直在覆盖 sep 的内容。并且永远不要在任何输入上使用eval - 它可以执行任意代码。
  • 我不明白sep 有什么问题,一次分配所有内容会更简单吗?如果你能做到,但下次我会注意eval,谢谢!
  • @kengu 在for 循环的每次迭代中,变量sep 从新读取的行中获取新值,因此前一行被遗忘。
  • 这就是为什么它只打印第二行。所以你在它自己的函数中分离了所有东西,以避免它们相互分配新值?
【解决方案2】:

我会删除您的 main 函数,因为您的示例中并不真正需要它,并在 for 循环本身中调用 toNumbers 和 sumlist。请注意,您需要将变量作为函数的参数传递:

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

【讨论】:

  • 非常感谢!这看起来比我所做的要简单得多。我正在查看一堆示例以供参考,并认为它们是我需要的东西,例如 main 如果我正在使用函数。不过我也不是太远了吧?
  • @kengu 没问题 :) Python 是一种重视代码可读性的语言。因此,(通常)越容易阅读您的代码,它就越好。如果这解决了您的问题,请不要忘记投票并接受答案。
  • This 也可能有用:)
  • 从现在开始我会牢记这一点,哈哈,再次感谢。另外,如果可以的话,我会完全支持你们,实际上我只是创建了这个帐户,因为我已经厌倦了编码......但如果我可以的话,我会在我的代表上升时!
【解决方案3】:

您上面的代码甚至无法在 python 3 中为我运行。但是如下将 readline 更改为 readlines 确实可以完美运行。

lines = file.readlines()
for line in lines:
    sep = line.split(",")

【讨论】:

  • 这是我现在得到的AttributeError: 'list' object has no attribute 'split'我在拆分 readlines 之前尝试过,但由于某种原因它对我不起作用
【解决方案4】:

问题是因为您在for 循环上使用file,并且在每个步骤上都使用file.readline()。这就是为什么当你有 3 行时它会显示错误。尝试添加另一行,4 行,它会显示最后一行。

打印您的read 和sep 会对您有所帮助。 您会注意到使用您的代码,由于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)

【讨论】:

  • 这很有道理,从来没有去过第四行,因为我对前两行感到非常沮丧!我正在打印我的输入以查看它们的位置,但这只会让我更加困惑。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多