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

如何用Python转换Airtable导出的JSON数据格式?

如何将Airtable获取的JSON数据按州分组转换格式?

我正尝试将从Airtable获取的JSON数据转换为新的JSON格式,但遇到了困难。以下是从Airtable获取的JSON数据:

dataset = {"records": [{"id": "recVqe2l15WKanDS1", "fields": {"confirm": "2", "state": "MA\n", "time": "2019-01-01", "predict": "2"}, "createdTime": "2020-09-19T01:53:47.000Z"}, {"id": "rechRMD3sKzsweZO8", "fields": {"confirm": "1", "state": "MA\n", "time": "2019-01-01", "predict": "1"}, "createdTime": "2020-09-19T01:53:47.000Z"}, {"id": "recnO0uTnz3LmJNGF", "fields": {"confirm": "3", "state": "MA\n", "time": "2019-01-01", "predict": "3"}, "createdTime": "2020-09-19T01:53:47.000Z"}]} 

我只需要每个"fields"中的信息以及"state"字段作为键,最终格式如下:

{ "MA":[{"confirm": "2", "time": "2019-01-01", "predict": "2"}, {"confirm": "1", "time": "2019-01-01", "predict": "1"}, {"confirm": "3", "time": "2019-01-01", "predict": "3"} ....(可包含更多州的数据)] } 

即移除原数据中的state字段,将其作为外层键,对应值为该州的记录列表。我已尝试以下代码:

records = dataset['records']
for i in records:
    fields = i['fields']
    state = i['fields'].get('state')
    print(state)

输出为:

MA
MA
MA

也能获取到fields数据:

records = dataset['records']
for i in records:
    fields = i['fields']
    print(fields)

输出为:

{'confirm': '2', 'state': 'MA\n', 'time': '2019-01-01', 'predict': '2'}
{'confirm': '1', 'state': 'MA\n', 'time': '2019-01-01', 'predict': '1'}
{'confirm': '3', 'state': 'MA\n', 'time': '2019-01-01', 'predict': '3'}

想请教如何用Python实现所需的数据格式转换,感谢帮助!


没问题,你已经完成了最关键的两步——获取到了state和对应的fields数据,现在只需要把它们按州分组并整理格式就行。这里有两种简单的实现方式:

方法一:基础循环实现

这是最直观的方式,适合理解整个过程:

dataset = {"records": [{"id": "recVqe2l15WKanDS1", "fields": {"confirm": "2", "state": "MA\n", "time": "2019-01-01", "predict": "2"}, "createdTime": "2020-09-19T01:53:47.000Z"}, {"id": "rechRMD3sKzsweZO8", "fields": {"confirm": "1", "state": "MA\n", "time": "2019-01-01", "predict": "1"}, "createdTime": "2020-09-19T01:53:47.000Z"}, {"id": "recnO0uTnz3LmJNGF", "fields": {"confirm": "3", "state": "MA\n", "time": "2019-01-01", "predict": "3"}, "createdTime": "2020-09-19T01:53:47.000Z"}]} 

# 初始化一个空字典来存储结果
result = {}

for record in dataset['records']:
    fields = record['fields'].copy()  # 复制一份,避免修改原数据
    # 取出state并去除末尾的换行符(你的数据里state有\n)
    state = fields.pop('state').strip()
    # 如果该州还不在结果字典里,先创建一个空列表
    if state not in result:
        result[state] = []
    # 把处理后的fields添加到对应州的列表里
    result[state].append(fields)

print(result)

运行这段代码后,输出就是你想要的格式:

{'MA': [{'confirm': '2', 'time': '2019-01-01', 'predict': '2'}, {'confirm': '1', 'time': '2019-01-01', 'predict': '1'}, {'confirm': '3', 'time': '2019-01-01', 'predict': '3'}]}

方法二:使用collections.defaultdict简化代码

如果想让代码更简洁,可以用Python标准库的defaultdict,它会自动为不存在的键创建默认值(这里是空列表):

from collections import defaultdict

dataset = {"records": [{"id": "recVqe2l15WKanDS1", "fields": {"confirm": "2", "state": "MA\n", "time": "2019-01-01", "predict": "2"}, "createdTime": "2020-09-19T01:53:47.000Z"}, {"id": "rechRMD3sKzsweZO8", "fields": {"confirm": "1", "state": "MA\n", "time": "2019-01-01", "predict": "1"}, "createdTime": "2020-09-19T01:53:47.000Z"}, {"id": "recnO0uTnz3LmJNGF", "fields": {"confirm": "3", "state": "MA\n", "time": "2019-01-01", "predict": "3"}, "createdTime": "2020-09-19T01:53:47.000Z"}]} 

result = defaultdict(list)

for record in dataset['records']:
    fields = record['fields'].copy()
    state = fields.pop('state').strip()
    result[state].append(fields)

# 如果需要转换成普通字典(可选)
result = dict(result)

print(result)

这个方法和第一种逻辑完全一样,只是少了判断州是否存在的步骤,代码更紧凑。

关键细节说明

  • 用fields.pop('state')既取出了state的值,又从fields里移除了这个字段,一举两得。
  • 加上.strip()是因为你的state字段末尾有换行符\n,处理后得到干净的州名。
  • 用fields.copy()是为了避免修改原dataset里的字段数据,如果不需要保留原数据,也可以直接操作原fields。

内容的提问来源于stack exchange,提问作者Flibbertigibbet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:17:35