如何用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
相关产品推荐
相关产品推荐

