使用for循环读取TXT文件计算BMI时仅生效最后一行数据的问题
解决读取多行BMI数据仅输出最后一行结果的问题
我之前踩过一模一样的坑!这种情况大概率是两个原因之一:要么你把写入文件的代码放在了循环外面,循环结束后只写入了最后一次计算的结果;要么是每次循环都重新以覆盖模式打开输出文件,把之前的内容都冲掉了。
先给你看最常见的错误写法(是不是和你的代码有点像?):
# 错误示例:写入操作在循环外部 height = 0.0 weight = 0.0 bmi = 0.0 category = "" with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile: for line in infile: # 拆分每行的身高和体重 h, w = line.strip().split(',') height = float(h) weight = float(w) # 计算BMI和分类 bmi = weight / (height ** 2) if bmi < 18.5: category = 'underweight' elif 18.5 <= bmi < 24: category = 'healthy' elif 24 <= bmi < 28: category = 'overweight' else: category = 'unhealthy' # 这里!循环结束才写,当然只有最后一行的数据 outfile.write(f"{height}, {weight}, {bmi:.1f}, {category}\n")
正确的写法:把写入放到循环内部
只要把写入文件的代码挪到循环里面,每次处理完一行数据就立刻写入,就能保留所有行的结果了。另外我还加了一些容错处理,比如跳过空行、捕获无效数据的错误:
with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile: # 可选:写入表头,让结果更清晰 outfile.write("height, weight, BMI, category\n") for line in infile: # 先处理空行,避免报错 cleaned_line = line.strip() if not cleaned_line: continue # 用try-except处理格式错误的行 try: # 拆分时记得去掉每个值前后的空格 h_str, w_str = cleaned_line.split(',') height = float(h_str.strip()) weight = float(w_str.strip()) except ValueError: print(f"跳过无效数据行:{cleaned_line}") continue # 计算BMI bmi = weight / (height ** 2) # 判断BMI分类 if bmi < 18.5: category = 'underweight' elif 18.5 <= bmi < 24: category = 'healthy' elif 24 <= bmi < 28: category = 'overweight' else: category = 'unhealthy' # 关键:每次循环都写入一行结果 outfile.write(f"{height}, {weight}, {bmi:.1f}, {category}\n")
另一种可能的错误:循环内重复打开文件
如果你是在循环里面用open('output.txt', 'w')打开文件,那每次打开都会清空文件内容,最后也只会留下最后一行的结果。这种情况的解决办法是把文件打开的代码移到循环外面,或者用追加模式'a'——不过追加模式如果多次运行程序,会把结果重复写入,所以更推荐前者。
运行上面的正确代码后,你的输出文件应该就能包含每一行输入数据对应的BMI结果啦!
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

