如何在for-loop中调用自定义BMI计算分类函数并完成文件读写?
解决BMI计算与文件处理结合的问题
看起来你已经搞定了核心的BMI逻辑和基础文件操作,现在只需要把这两部分串起来就行。我来帮你完成整合,顺便解决你提到的列翻转问题。
第一步:确认你的BMI计算函数
先确保你的函数能正确接收身高(建议用米为单位)和体重(千克),返回BMI数值和对应的分类。这里给你一个标准的示例(你可以根据自己的分类规则调整):
def calculate_bmi(height, weight): # BMI计算公式:体重(kg) ÷ (身高(m))² bmi = weight / (height ** 2) # 按国内通用标准分类 if bmi < 18.5: category = "体重过轻" elif 18.5 <= bmi < 24: category = "正常体重" elif 24 <= bmi < 28: category = "超重" else: category = "肥胖" # 保留两位小数,让结果更整洁 return round(bmi, 2), category
第二步:整合文件读写与循环调用
接下来处理文件读写,重点解决列翻转问题——你提到读取时列顺序颠倒,大概率是读取数据时把身高和体重的位置搞反了,所以读取每行数据时要确认字段顺序。
假设你的bmi.txt是每行存储一个用户的身高和体重,用逗号或空格分隔(比如1.75 65或1.75,65),我们可以这样整合:
# 同时打开原文件和目标文件,用with语句自动管理文件关闭 with open("bmi.txt", "r", encoding="utf-8") as input_file, open("bmi_calculated.txt", "w", encoding="utf-8") as output_file: # 处理表头(如果原文件有表头的话) header = input_file.readline().strip() # 新增BMI和分类的表头 output_file.write(f"{header},BMI,分类\n") # 遍历文件中剩下的每一行数据 for line in input_file: line = line.strip() if not line: # 跳过空行,避免报错 continue # 分割数据:如果是空格分隔就用line.split(),逗号分隔就用line.split(",") # 👉 这里是解决列翻转的关键:如果原文件是体重在前、身高在后,就把两个变量交换位置 height_str, weight_str = line.split(",") try: # 转换为数值类型 height = float(height_str) weight = float(weight_str) # 调用你的BMI计算函数 bmi_value, bmi_category = calculate_bmi(height, weight) # 将原数据+BMI+分类写入新文件 output_file.write(f"{line},{bmi_value},{bmi_category}\n") except ValueError: # 处理无效数据行(比如非数字内容),避免程序崩溃 print(f"跳过无效数据行:{line}") output_file.write(f"{line},无效数据,无效数据\n")
关键细节提醒
- 列翻转修复:如果原文件里是「体重在前、身高在后」,只需要把
height_str, weight_str = line.split(",")改成weight_str, height_str = line.split(",")即可,确保传入函数的参数顺序正确。 - 编码问题:加上
encoding="utf-8"可以避免中文分类出现乱码。 - 异常处理:加入
try-except能应对文件中的无效数据(比如非数字内容),保证程序能完整运行。 - 无表头情况:如果你的
bmi.txt没有表头,直接删除处理表头的两行代码,从循环开始即可。
测试示例
假设你的bmi.txt内容是:
身高,体重 1.75,65 1.60,48 1.80,90
运行代码后,bmi_calculated.txt会生成:
身高,体重,BMI,分类 1.75,65,21.22,正常体重 1.60,48,18.75,正常体重 1.80,90,27.78,超重
这样就完美把你的BMI函数和文件循环处理结合起来啦!
内容的提问来源于stack exchange,提问作者Jessica Nielson
相关产品推荐
相关产品推荐

