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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:16:44