You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用eval()解析文件行内容时触发SyntaxError的问题求助

问题分析与修正

你的代码存在几个关键问题,导致了报错和逻辑错误:

错误点说明

  • 循环终止条件错误:readline()读取到文件末尾时返回的是空字符串"",而非你判断的空格" "。同时每行末尾默认带有换行符\n,这个条件既无法正确终止循环,还会误判空格为终止信号。
  • eval()的使用问题:当读取到空字符串(文件末尾)或空行时,eval("")会直接抛出语法错误,这就是你看到的报错根源。而且eval()存在安全风险,完全没必要用它来转换数字。
  • 未处理行内空白字符:文件行的数字可能带有换行符、前后空格,直接转换会触发错误。
  • 未正确管理文件资源:直接open()文件后未调用close(),容易造成资源泄漏。

修正后的代码

def main():
    fileName = input("What file are the numbers in?")
    sum_total = 0.0  # 避免用sum作为变量名,它是Python内置函数
    count = 0
    # 使用with语句自动管理文件,无需手动close
    with open(fileName, 'r') as infile:
        line = infile.readline()
        # 只要读取到的内容非空就继续循环
        while line:
            # 去除行前后的空白字符(换行、空格等)
            cleaned_line = line.strip()
            # 跳过空行
            if cleaned_line:
                # 安全转换为浮点数(如果是整数也可以用int())
                num = float(cleaned_line)
                sum_total += num
                count += 1
            line = infile.readline()
    # 处理无有效数字的情况,避免除以0
    if count == 0:
        print("文件中没有有效数字")
    else:
        print("The average of the numbers is", sum_total / count)

main()

修正细节说明

  1. 把循环条件改为while line,只要读取到的内容不是空字符串就继续执行
  2. 用strip()处理每行的空白字符,同时跳过空行
  3. 用float()替代eval(),安全实现字符串到数字的转换
  4. 使用with语句自动管理文件生命周期,避免资源泄漏
  5. 避免使用sum作为变量名(它是Python内置函数,覆盖后会引发其他问题)
  6. 增加了count=0的判断逻辑,防止出现除以0的错误

内容的提问来源于stack exchange,提问作者Akua Pipim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:01:15