文件不存在重运行代码失效及文件存在后功能停滞问题排查
问题分析与修复方案
第一个版本代码的问题
- 无限循环原因:函数里的while循环没更新文件名,每次都用最初传入的不存在的文件名重试,自然一直触发
FileNotFoundError,死循环停不下来。 - 逻辑致命错误:打开文件后立刻写了
break,直接跳出with块,后面读取文件、处理数据的代码根本不会执行,等于白打开文件。 - 语法/缩进错误:
for line in h:下面的代码没缩进,运行会直接报语法错误。 - 错误捕获不全:内层
try-except只包了添加数据的部分,split分割行、float转换的步骤没被包裹,一旦行格式不对(比如分隔符错、元素数量不够),会直接抛出未捕获的异常。
第二个版本代码的问题
- 缩进错误:
for line in h:下面的batch, x, y, value = line.split(',')没缩进,导致循环遍历完所有行后,只处理最后一行的数据,前面的行全丢了。 - 错误捕获位置不对:
try-except放在了for循环外面,而且没包裹split操作,只要有一行格式错,就会直接报错终止程序,没法继续处理其他行。 - 未处理行尾空白:直接用
line.split(',')可能会把行尾的换行符带进去,导致转float失败,应该先去掉行首尾空白。
修复后的代码
推荐把获取文件名的循环放在函数外,让函数专注于读取和处理数据,职责更清晰:
def collect_exp_data(file_name): data = dict() with open(file_name, 'r') as h: for line in h: # 先去掉行首尾的空白(包括换行符),再分割 line = line.strip() # 跳过空行 if not line: continue try: # 分割成四个元素,元素数量不对会触发ValueError batch, x, y, value = line.split(',') # 转换为浮点数,格式不对也会触发ValueError x_float = float(x.strip()) y_float = float(y.strip()) value_float = float(value.strip()) # 整理数据到字典 if batch not in data: data[batch] = [] data[batch].append((x_float, y_float, value_float)) except ValueError as e: print(f"\n行内容格式错误:{line},错误信息:{e},跳过该行") return data # 外层循环获取正确的文件名 while True: file_name = input("请输入文件名:") try: data = collect_exp_data(file_name) print("文件读取成功!") # 这里可以添加后续功能的代码,比如打印数据或者处理数据 print("读取到的数据:", data) break except FileNotFoundError: print("文件不存在,请重新输入!")
修复要点说明
- 把文件名输入的循环放在函数外,确保每次文件不存在时,能重新获取新的文件名。
- 修复缩进问题,让每行的处理代码都在for循环内部。
- 把
split和float转换都放进try-except块里,捕获所有格式错误,并且打印错误行的内容,方便排查。 - 添加
line.strip()处理行首尾空白,避免换行符或空格导致的转换错误。 - 增加跳过空行的逻辑,避免处理空行引发错误。
内容的提问来源于stack exchange,提问作者rail
相关产品推荐
相关产品推荐

