如何用Python从数千条此类记录中提取食物名称及营养成分名称和数值?
如何用Python从批量JSON记录中提取食物名称、营养成分及对应数值
针对你手头数千条示例格式的JSON记录,以下是直接可复用的提取方案:
1. 先确保JSON格式合法
示例中的原始JSON存在格式缺失(最后一个dishes项未闭合),处理前要修复这类语法问题,否则解析会失败。
2. 基础提取代码
用Python内置的json模块解析数据,然后嵌套遍历提取目标字段:
import json # 示例修复后的JSON字符串 raw_json = '[{"meal": "MY food", "dishes": [{"nutritions": [{"name": "Calories", "value": "412"}, {"name": "Carbs", "value": "29"}, {"name": "Fat", "value": "24"}, {"name": "Protein", "value": "21"}, {"name": "Sodium", "value": "258"}, {"name": "Sugar", "value": "29"}], "name": "my - McDonalds Espresso Pronto® Flat White, 2 TALL"}, {"nutritions": [{"name": "Calories", "value": "170"}, {"name": "Carbs", "value": "25"}, {"name": "Fat", "value": "5"}, {"name": "Protein", "value": "20"}, {"name": "Sodium", "value": "260"}, {"name": "Sugar", "value": "2"}], "name": "Quest Bar - Banana Nut Muffin Natural Protein Bar, 60 g"}, {"nutritions": [{"name": "Calories", "value": "176"}, {"name": "Carbs", "value": "33"}, {"name": "Fat", "value": "1"}, {"name": "Protein", "value": "5"}, {"name": "Sodium", "value": "195"}, {"name": "Sugar", "value": "0"}]}]}]' # 解析JSON data = json.loads(raw_json) # 提取核心数据 extracted = [] for meal in data: for dish in meal["dishes"]: food_name = dish["name"] for nutrient in dish["nutritions"]: extracted.append({ "食物名称": food_name, "营养成分": nutrient["name"], "数值": nutrient["value"] }) # 验证结果 for item in extracted[:3]: print(item)
3. 批量处理文件中的数千条记录
如果数据存储在JSON文件中(比如一个大数组或每行一条JSON),可以直接读取文件处理,还能把结果导出为CSV方便后续分析:
import json import csv # 读取批量JSON文件 with open("food_records.json", "r", encoding="utf-8") as f: data = json.load(f) # 提取逻辑同上 extracted = [] for meal in data: for dish in meal["dishes"]: food_name = dish["name"] for nutrient in dish["nutritions"]: # 可选:将数值转为数字类型(处理非数值时加try-except) try: value = float(nutrient["value"]) except ValueError: value = nutrient["value"] extracted.append({ "食物名称": food_name, "营养成分": nutrient["name"], "数值": value }) # 导出为CSV with open("nutrition_data.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=["食物名称", "营养成分", "数值"]) writer.writeheader() writer.writerows(extracted)
注意事项
- 若原始JSON存在格式错误,可先用在线JSON校验工具排查,或在代码中加入
try-except捕获异常并记录问题数据 - 针对超大规模数据,改用生成器(
yield)逐步处理,避免内存溢出 - 数值转换时要考虑异常情况(比如非数字字符串),避免程序崩溃
内容的提问来源于stack exchange,提问作者Ahtisham Ali
相关产品推荐
相关产品推荐

