免费宏观参考表:下载完整营养数据(CSV和JSON格式)

下载包含500多种常见食物的完整营养数据的免费宏观参考表,格式为CSV和JSON。包括按食物类别组织的蛋白质、碳水化合物、脂肪、纤维和卡路里。

Medically reviewed by Dr. Emily Torres, Registered Dietitian Nutritionist (RDN)

无论您是在开发营养应用、进行研究、指导客户,还是仅仅想在桌面上有一份可靠的参考资料,您都需要干净的宏观数据,以便于实际使用。尽管政府数据库存在,但它们往往庞大、格式不一致,更适合官僚,而非开发者。

我们整理了一套免费的宏观参考表,涵盖500多种常见食物的完整宏观营养成分。数据以CSV和JSON格式提供,方便直接导入电子表格、数据库、脚本或应用程序。每一项数据都经过主要来源的验证,文件结构合理,您可以立即使用,无需清理或转换。

本页面详细介绍了表格中的内容、数据结构、如何以编程方式加载数据,以及如果您发现需要更新的内容如何提交更正。

包含的内容

宏观参考表包含500多种在七个主要类别中最常消费的食物。每种食物项提供以下信息:

  • 食物名称 — 营养科学中使用的标准英文名称
  • 类别 — 七个顶级类别之一(详细信息见下文)
  • 子类别 — 在父类别内的更具体分组
  • 份量描述 — 可读的份量描述(例如,“1个中等香蕉”,“1杯熟食”)
  • 份量重量(克) — 该份量的克数
  • 卡路里 — 总能量(千卡)
  • 蛋白质 — 每份的蛋白质克数
  • 总脂肪 — 每份的总脂肪克数
  • 饱和脂肪 — 每份的饱和脂肪克数
  • 总碳水化合物 — 每份的总碳水化合物克数
  • 膳食纤维 — 每份的膳食纤维克数
  • — 每份的总糖克数
  • — 每份的钠毫克数

所有数值均按列出的份量报告,而非每100克。我们选择这种方法是因为基于份量的数据是大多数人在跟踪餐食、制定餐单或在界面中显示营养信息时所需的。如果您需要每100克的数值,可以简单地将份量重量除以100并乘以100。

表格中不包括微量营养素,除了钠和纤维。有关完整的微量营养素资料(维生素、矿物质、氨基酸),请参见本文末尾Nutrola API的部分——详细数据就在那儿。

数据格式规格

CSV格式

CSV文件使用UTF-8编码,包含标题行。字段用逗号分隔,文本字段用引号括起来。结构如下所示:

food_name,category,subcategory,serving_description,serving_weight_g,calories_kcal,protein_g,total_fat_g,saturated_fat_g,total_carbs_g,fiber_g,sugar_g,sodium_mg
"去骨去皮鸡胸肉,熟","蛋白质","家禽","1块(170克)",170,284,53.4,6.2,1.7,0.0,0.0,0.0,126
"大西洋鲑鱼,熟","蛋白质","鱼类和海鲜","1片(154克)",154,280,39.3,12.4,2.5,0.0,0.0,0.0,109
"糙米,熟","谷物和淀粉","全谷物","1杯(195克)",195,216,5.0,1.8,0.4,44.8,3.5,0.7,10
"香蕉,生","水果","热带水果","1个中等(118克)",118,105,1.3,0.4,0.1,27.0,3.1,14.4,1

CSV文件与Microsoft Excel、Google Sheets、LibreOffice Calc、Apple Numbers以及任何支持CSV解析的编程语言兼容。无需特殊配置——打开文件即可正确解析。

JSON格式

JSON文件包含一个对象数组,每个对象对应一个食物项。结构与CSV字段相似:

{
  "version": "1.4.0",
  "generated": "2026-03-12",
  "source": "Nutrola Macro Reference Tables",
  "record_count": 527,
  "foods": [
    {
      "food_name": "去骨去皮鸡胸肉,熟",
      "category": "蛋白质",
      "subcategory": "家禽",
      "serving_description": "1块(170克)",
      "serving_weight_g": 170,
      "nutrients": {
        "calories_kcal": 284,
        "protein_g": 53.4,
        "total_fat_g": 6.2,
        "saturated_fat_g": 1.7,
        "total_carbs_g": 0.0,
        "fiber_g": 0.0,
        "sugar_g": 0.0,
        "sodium_mg": 126
      }
    }
  ]
}

JSON文件在顶层包含元数据字段:版本字符串用于跟踪更新、生成日期、来源名称和总记录数。这使得您可以轻松验证您是否拥有最新版本,并在应用程序中构建更新检查逻辑。

数值以数字形式存储,而非字符串。空值不会出现——如果某个营养值未知,该食物将被排除在数据集之外,而不是包含缺失数据。这是为了保持数据的整洁,避免计算中的隐性错误。

字段描述

以下是每个字段的详细说明,包括单位、预期范围和边缘情况:

字段 类型 单位 描述
food_name 字符串 标准英文名称。包括相关的准备方法(例如,“熟”,“生”,“干燥”)。
category 字符串 七个顶级类别之一。见下文的类别部分。
subcategory 字符串 更具体的分组。例如,在“蛋白质”中,您会找到“家禽”、“红肉”、“鱼类和海鲜”、“豆类”和“鸡蛋”。
serving_description 字符串 可读的份量描述。始终包括克重(以括号表示)。
serving_weight_g 数字 份量的克数。大多数项目为整数值,精确度高的项目为一位小数。
calories_kcal 数字 千卡 总能量。使用Atwater系统计算(4千卡/克蛋白质,4千卡/克碳水化合物,9千卡/克脂肪)。
protein_g 数字 总蛋白质。精确到一位小数。
total_fat_g 数字 总脂肪,包括饱和脂肪、单不饱和脂肪和多不饱和脂肪。
saturated_fat_g 数字 仅饱和脂肪酸。
total_carbs_g 数字 总碳水化合物,包括纤维和糖。
fiber_g 数字 总膳食纤维(可溶性+不可溶性)。
sugar_g 数字 总糖(自然存在+添加)。数据集不将添加糖与天然糖分开。
sodium_mg 数字 毫克 钠含量。请注意,这是毫克,而不是克,与其他营养字段不同。

关于精度的几点说明:所有营养值均四舍五入到一位小数。这与基础来源数据的精度水平相匹配。报告更多小数位数会暗示虚假的准确性——食物成分因生长条件、动物品种和准备方法的不同而自然变化5-15%。

食物类别

500多种食物被组织为七个顶级类别,每个类别下有多个子类别:

蛋白质

大约95个条目,涵盖家禽(鸡胸肉、鸡腿、火鸡、火鸡肉末)、红肉(牛肉西冷、不同瘦肉比例的牛肉末、猪里脊、羊肉)、鱼类和海鲜(鲑鱼、金枪鱼、虾、鳕鱼、罗非鱼、沙丁鱼)、鸡蛋(全蛋、蛋白、炒蛋)以及植物性蛋白(豆腐、天贝、面筋、毛豆)。豆类如扁豆、鹰嘴豆和黑豆在此列出,而非谷物,因为它们的主要营养角色是提供蛋白质。

谷物和淀粉

大约80个条目,涵盖全谷物(糙米、燕麦、藜麦、大麦、粗麦粉)、精制谷物(白米、白面包、意大利面)、淀粉类蔬菜(土豆、红薯、玉米)和常见谷物产品(玉米饼、百吉饼、饼干、库斯库斯)。对于重要的谷物,提供熟食和干食的数值。

水果

大约65个条目,涵盖常见的新鲜水果(苹果、香蕉、橙子、草莓、蓝莓、葡萄)、热带水果(芒果、菠萝、木瓜、猕猴桃)、干果(葡萄干、枣、干杏、蔓越莓)和冷冻水果。所有新鲜水果条目均为可食用部分的生重——种子、果皮和果核在适用情况下不计入份量重量。

蔬菜

大约85个条目,涵盖绿叶蔬菜(菠菜、羽衣甘蓝、生菜、芝麻菜)、十字花科蔬菜(西兰花、花椰菜、布鲁塞尔芽菜、卷心菜)、根菜(胡萝卜、甜菜、萝卜、白萝卜)、葱科(洋葱、大蒜)、茄科(西红柿、甜椒、茄子)以及其他常见蔬菜(黄瓜、芹菜、意大利青瓜、蘑菇、芦笋)。对于烹饪显著改变营养密度的蔬菜,提供生食和熟食的数值。

乳制品及替代品

大约70个条目,涵盖牛奶(全脂、2%、脱脂及植物性牛奶)、酸奶(希腊酸奶、普通酸奶、调味酸奶、植物性酸奶)、奶酪(切达奶酪、马苏里拉奶酪、菲达奶酪、农家奶酪、奶油奶酪、帕尔马奶酪)、黄油、奶油和常见的乳制品替代品(杏仁奶、燕麦奶、大豆奶、椰子酸奶)。植物性牛奶和酸奶被归类在此,而不是单独的类别,因为用户通常将其视为直接替代品。

零食和加工食品

大约75个条目,涵盖坚果和种子(杏仁、核桃、花生、奇亚籽、亚麻籽、向日葵种子)、坚果酱(花生酱、杏仁酱)、常见零食(椒盐卷饼、爆米花、谷物棒、蛋白棒、混合坚果、薯片、黑巧克力)、涂抹酱和调味品(鹰嘴豆泥、鳄梨酱、莎莎酱、蛋黄酱、橄榄油、蜂蜜)以及其他常见的追踪项目,如蛋白粉和能量球。

饮料

大约60个条目,涵盖果汁(橙汁、苹果汁、蔓越莓汁)、软饮(可乐、柠檬汽水、生姜啤酒)、运动饮料和能量饮料、咖啡饮品(黑咖啡、拿铁、卡布奇诺、摩卡,配各种牛奶)、奶昔基础、酒精饮料(啤酒、葡萄酒、烈酒)以及常见添加物(奶油、糖、调味糖浆)。水不包括在内,因为它没有宏观营养成分。

以编程方式使用数据

提供CSV和JSON格式的主要目的是让您可以直接将这些数据加载到代码中。以下是Python和JavaScript的工作示例。

Python:加载CSV

import csv

def load_macro_table(filepath):
    foods = []
    with open(filepath, newline='', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            # 将数字字段从字符串转换
            for key in ['serving_weight_g', 'calories_kcal', 'protein_g',
                        'total_fat_g', 'saturated_fat_g', 'total_carbs_g',
                        'fiber_g', 'sugar_g', 'sodium_mg']:
                row[key] = float(row[key])
            foods.append(row)
    return foods

foods = load_macro_table('macro_reference_table.csv')

# 查找某一类别下的所有食物
proteins = [f for f in foods if f['category'] == '蛋白质']
print(f"找到{len(proteins)}种蛋白质来源")

# 查找每卡路里蛋白质含量最高的食物
foods_sorted = sorted(foods, key=lambda f: f['protein_g'] / max(f['calories_kcal'], 1), reverse=True)
print("\n按蛋白质密度(每卡路里克数)排名前10的食物:")
for f in foods_sorted[:10]:
    ratio = f['protein_g'] / f['calories_kcal']
    print(f"  {f['food_name']}: {ratio:.3f} g/kcal ({f['protein_g']}g蛋白质, {f['calories_kcal']} kcal)")

Python:加载JSON

import json

def load_macro_json(filepath):
    with open(filepath, encoding='utf-8') as f:
        data = json.load(f)
    print(f"加载了{data['record_count']}种食物(版本{data['version']})")
    return data['foods']

foods = load_macro_json('macro_reference_table.json')

# 根据食物名称构建查找字典
lookup = {f['food_name'].lower(): f for f in foods}

# 快速查找
chicken = lookup.get('去骨去皮鸡胸肉,熟')
if chicken:
    n = chicken['nutrients']
    print(f"鸡胸肉每份({chicken['serving_description']}):")
    print(f"  卡路里:{n['calories_kcal']} kcal")
    print(f"  蛋白质:{n['protein_g']}g")
    print(f"  脂肪:{n['total_fat_g']}g")
    print(f"  碳水化合物:{n['total_carbs_g']}g")

JavaScript:在Node.js中加载JSON

const fs = require('fs');

function loadMacroTable(filepath) {
  const raw = fs.readFileSync(filepath, 'utf-8');
  const data = JSON.parse(raw);
  console.log(`加载了${data.record_count}种食物(版本${data.version})`);
  return data.foods;
}

const foods = loadMacroTable('macro_reference_table.json');

// 按类别分组食物
const byCategory = {};
for (const food of foods) {
  if (!byCategory[food.category]) {
    byCategory[food.category] = [];
  }
  byCategory[food.category].push(food);
}

// 打印摘要
for (const [category, items] of Object.entries(byCategory)) {
  console.log(`${category}: ${items.length}种食物`);
}

// 查找低卡路里、高纤维的食物
const highFiber = foods
  .filter(f => f.nutrients.fiber_g >= 5 && f.nutrients.calories_kcal <= 200)
  .sort((a, b) => b.nutrients.fiber_g - a.nutrients.fiber_g);

console.log('\n高纤维、低卡路里的食物:');
highFiber.slice(0, 10).forEach(f => {
  console.log(`  ${f.food_name}: ${f.nutrients.fiber_g}g纤维, ${f.nutrients.calories_kcal} kcal`);
});

JavaScript:在浏览器中加载CSV

// 基于浏览器的CSV解析(无依赖)
async function loadMacroCSV(url) {
  const response = await fetch(url);
  const text = await response.text();
  const lines = text.split('\n').filter(line => line.trim());
  const headers = parseCSVLine(lines[0]);

  return lines.slice(1).map(line => {
    const values = parseCSVLine(line);
    const obj = {};
    headers.forEach((header, i) => {
      obj[header] = isNaN(values[i]) ? values[i] : parseFloat(values[i]);
    });
    return obj;
  });
}

function parseCSVLine(line) {
  const result = [];
  let current = '';
  let inQuotes = false;
  for (const char of line) {
    if (char === '"') { inQuotes = !inQuotes; }
    else if (char === ',' && !inQuotes) { result.push(current.trim()); current = ''; }
    else { current += char; }
  }
  result.push(current.trim());
  return result;
}

// 使用示例
const foods = await loadMacroCSV('/data/macro_reference_table.csv');
console.log(`加载了${foods.length}种食物`);

这些示例展示了最常见的操作:加载数据、搜索和过滤、按类别分组以及按营养密度排序。数据结构设计得简单,以便您无需任何特殊库即可使用它们。

数据来源

宏观参考表的数据来自以下主要来源:

USDA SR遗留数据库。 USDA标准参考遗留数据库是美国食物成分的基础数据集。它包含超过7600种食物的实验室分析营养数据。我们的表格使用SR遗留作为通用/无品牌食物的主要来源。我们选择SR遗留而非更新的FoodData Central FNDDS,因为SR遗留的数值在营养研究中更广泛地得到验证和引用。

USDA FoodData Central。 对于SR遗留中未涵盖的食物,特别是更新的食物项和数值,我们参考FoodData Central的基础食物和调查食物数据集。

国际食物成分数据库。 对于全球消费但可能未出现在美国数据库中的食物,我们交叉参考来自公共卫生英格兰的McCance和Widdowson成分表、澳大利亚新西兰食品标准局(FSANZ)NUTTAB、加拿大营养文件(CNF)和丹麦食品成分数据库(Frida)的数据。这对于热带水果、区域谷物和在美国以外常见的准备方法尤为重要。

制造商数据。 对于零食和饮料类别中的加工和品牌项目,我们参考制造商提供的营养成分标签。在制造商数据与实验室分析存在冲突时,我们会记录差异,并默认使用实验室数值。

所有数值均已通过至少两个独立来源进行交叉验证。如果来源之间的差异超过10%,我们会调查原因(通常是不同的准备方法或品种差异),并选择最能代表食物典型消费方式的数值。

数据集是有版本的。当前版本为1.4.0,最后更新于2026年3月。我们大约每季度更新一次表格,以纳入更正、添加请求的食物,并反映任何源数据库中的重大变化。

如何提交更正

营养数据本质上是不完美的。食物成分因地区、季节、品种和准备方法而异。如果您发现错误或有可靠来源支持的更正,我们希望听到您的意见。

有三种方式可以提交更正:

GitHub问题。 宏观参考表托管在公共GitHub存储库中。打开一个问题,提供食物名称、您认为不正确的字段、当前值、您认为正确的值以及您的来源链接。我们每周审核问题。

电子邮件。 将更正发送至data@nutrola.com,提供相同的信息:食物名称、字段、当前值、建议值和来源。我们将在五个工作日内回复。

拉取请求。 如果您熟悉Git,可以分叉存储库,直接编辑CSV或JSON文件,并提交拉取请求。请在PR描述中包含您的来源。我们将审核并合并有可靠数据支持的更正。

我们不接受通过此过程提交品牌或专有产品的请求。这些请求通过Nutrola的主要食品数据库管道处理,该管道有自己的验证工作流程。

与Nutrola API的实时数据集成

可下载的宏观参考表是静态快照——非常适合离线使用、嵌入式应用、教育材料和快速查找。但如果您需要大规模的实时营养数据,Nutrola的营养数据API提供了这些表格中的所有内容以及更多。

该API涵盖超过300万条食物条目(相比于参考表中的500多条),包括每项70多种营养素的完整微量营养素资料,支持条形码扫描、文本搜索和自动完成功能,并为来自47个国家的品牌产品提供数据。这是Nutrola应用程序每天为超过200万人提供的数据。

对于开发者:API是RESTful的,返回JSON,并提供每天500次请求的免费配额——足够用于原型和个人项目。付费配额可扩展到数百万次请求。您可以在api.nutrola.com/docs找到完整文档。

对于研究人员和机构:我们提供学术许可证,具有更高的速率限制和批量导出能力。有关详细信息,请联系research@nutrola.com

宏观参考表和API相辅相成。使用表格进行离线工作、嵌入数据集和需要自包含文件的情况。使用API时,您需要广度、深度、实时更新和搜索功能。

常见问题解答

宏观参考表更新的频率是多少?

我们大约每季度更新一次表格。每次发布都会获得一个新版本号(当前版本为1.4.0)。更新包括用户提交的更正、常见请求的食物添加,以及当我们的源数据库发布修订值时的调整。JSON文件在其元数据中包含版本和生成日期,因此您可以以编程方式检查是否拥有最新版本。

我可以在我的商业应用中使用这些数据吗?

可以。宏观参考表根据创意共享署名4.0(CC BY 4.0)许可证发布。您可以在个人和商业项目中使用、修改和重新分发数据,只要您提供署名即可。链接到nutrola.com或在您的数据说明中提到“Nutrola宏观参考表”即可。您无需请求许可或支付费用。

为什么只有500多种食物,而不是完整的Nutrola数据库?

参考表旨在成为最常消费食物的实用高质量子集。涵盖500多种项目跨越七个类别,约占大多数国家人们日常饮食的90%。扩展到300万条目会使文件在许多用例中变得笨重(完整数据库超过2GB)。如果您需要完整数据集,Nutrola API提供对所有内容的访问。

这些数值是每份还是每100克?

每份。每个条目包括份量描述(例如,“1个中等苹果(182克)”)及相应的克重,因此您可以通过将每个营养值除以份量重量并乘以100,轻松转换为每100克的值。我们选择每份值是因为它们在餐食跟踪、餐单规划和面向客户的应用中更为实用。

我该如何将数据转换为每100克的值?

将每个营养值乘以100并除以serving_weight_g字段。例如,如果170克的鸡胸肉每份含有53.4克蛋白质,则每100克的蛋白质值为(53.4 * 100)/ 170 = 31.4克。以下是一个快速的Python函数:

def per_100g(food, nutrient_field):
    """将每份营养值转换为每100克的值。"""
    serving_weight = food['serving_weight_g']
    if serving_weight == 0:
        return 0
    return round(food[nutrient_field] * 100 / serving_weight, 1)

如果我需要的食物不在表中,我该怎么办?

首先,检查是否存在不同名称的类似食物——使用文本编辑器的搜索功能或简单脚本搜索food_name字段。如果该食物确实未包含,您有两个选择:通过我们的GitHub存储库提交请求(我们根据需求优先添加),或使用Nutrola的API,该API涵盖超过300万种食物,更有可能满足您的需求。对于一次性查找,Nutrola应用程序本身允许您免费搜索完整数据库。

准备好改变您的营养追踪方式了吗?

加入成千上万已通过 Nutrola 改变健康之旅的用户!