使用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()
修正细节说明
- 把循环条件改为
while line,只要读取到的内容不是空字符串就继续执行 - 用
strip()处理每行的空白字符,同时跳过空行 - 用
float()替代eval(),安全实现字符串到数字的转换 - 使用
with语句自动管理文件生命周期,避免资源泄漏 - 避免使用
sum作为变量名(它是Python内置函数,覆盖后会引发其他问题) - 增加了
count=0的判断逻辑,防止出现除以0的错误
内容的提问来源于stack exchange,提问作者Akua Pipim
相关产品推荐
相关产品推荐

