python - 如何在 Python 中创建两级嵌套 JSON?
问题描述
我的数据看起来像这样
ENTITY,MEASUREMENT_DATE,CHART_VALUE,PARAM
143,2019/03/08 10:21:21 PM,0.047353,param1
143,2019/03/08 10:21:21 PM,40.25,param2
160,2019/03/08 10:57:18 AM,0.066874,param1
160,2019/03/06 4:24:31 PM,38,param2
143,2019/03/06 10:00:41 PM,0.01707,param1
143,2019/03/09 1:04:32 AM,35.25,param2
160,2019/03/06 4:24:31 PM,0.048042,param1
143,2019/03/07 12:09:38 AM,0,param1
160,2019/03/08 10:57:18 AM,42.25,param2
143,2019/03/09 1:04:32 AM,0.012104,param1
143,2019/03/06 10:00:41 PM,41.75,param2
143,2019/03/07 12:09:38 AM,36.5,param2
所需的输出应如下所示:
{
"143": {
"param1": {
"MEASUREMENT_DATE":
"CHART_VALUE":
},
"param2": {
"MEASUREMENT_DATE":
"CHART_VALUE":
},
},
"160": {
"param1": {
"MEASUREMENT_DATE":
"CHART_VALUE":
},
"param2": {
"MEASUREMENT_DATE":
"CHART_VALUE":
},
},
}
我已经尝试过这段代码,但我仍然没有得到按参数分组的列表:
with open('file.csv') as csvfile:
r = DictReader(csvfile, skipinitialspace=True)
data = [dict(d) for d in r]
groups = []
uniquekeys = []
for k, g in groupby(data, lambda r: ( r['PARAM'])):
groups.append({
"group": k,
"user": [{k: v for k, v in d.items() if k not in ['PARAM']} for d in list(g)]
})
uniquekeys.append(k)
解决方案
您有一个基本问题,您不能在示例中使用字典结构。
例如,您有两行分别为“143”和“param1”。字典不能在同一个键中保存多个值。这留下了两个选择(我认为)。要么你想在每个位置存储一组结果,要么你想有一种方法来选择一个值来存储在那个键上(例如按日期的最新值)。
尽管如此,这应该让你开始。这是您存储键的所有值的解决方案:
from __future__ import print_function
from pprint import pformat
import csv
try:
from io import StringIO
except:
from StringIO import StringIO
data = '''ENTITY,MEASUREMENT_DATE,CHART_VALUE,PARAM
143,2019/03/08 10:21:21 PM,0.047353,param1
143,2019/03/08 10:21:21 PM,40.25,param2
160,2019/03/08 10:57:18 AM,0.066874,param1
160,2019/03/06 4:24:31 PM,38,param2
143,2019/03/06 10:00:41 PM,0.01707,param1
143,2019/03/09 1:04:32 AM,35.25,param2
160,2019/03/06 4:24:31 PM,0.048042,param1
143,2019/03/07 12:09:38 AM,0,param1
160,2019/03/08 10:57:18 AM,42.25,param2
143,2019/03/09 1:04:32 AM,0.012104,param1
143,2019/03/06 10:00:41 PM,41.75,param2
143,2019/03/07 12:09:38 AM,36.5,param2
'''
class JsonBuilder(object):
def __init__(self):
self.result = {}
def ingest_row(self, row):
primary_key, mdate, value, param = row
if primary_key not in self.result:
self.result[primary_key] = {}
if param not in self.result[primary_key]:
self.result[primary_key][param] = []
self.result[primary_key][param].append({
"MEASUREMENT_DATE": mdate,
"CHART_VALUE": value })
def __str__(self):
return pformat(self.result)
builder = JsonBuilder()
reader = csv.reader(StringIO(data))
next(reader, None) #skip header
for row in reader:
builder.ingest_row(row)
print(builder)
输出:
{'143': {'param1': [{'CHART_VALUE': '0.047353',
'MEASUREMENT_DATE': '2019/03/08 10:21:21 PM'},
{'CHART_VALUE': '0.01707',
'MEASUREMENT_DATE': '2019/03/06 10:00:41 PM'},
{'CHART_VALUE': '0',
'MEASUREMENT_DATE': '2019/03/07 12:09:38 AM'},
{'CHART_VALUE': '0.012104',
'MEASUREMENT_DATE': '2019/03/09 1:04:32 AM'}],
'param2': [{'CHART_VALUE': '40.25',
'MEASUREMENT_DATE': '2019/03/08 10:21:21 PM'},
{'CHART_VALUE': '35.25',
'MEASUREMENT_DATE': '2019/03/09 1:04:32 AM'},
{'CHART_VALUE': '41.75',
'MEASUREMENT_DATE': '2019/03/06 10:00:41 PM'},
{'CHART_VALUE': '36.5',
'MEASUREMENT_DATE': '2019/03/07 12:09:38 AM'}]},
'160': {'param1': [{'CHART_VALUE': '0.066874',
'MEASUREMENT_DATE': '2019/03/08 10:57:18 AM'},
{'CHART_VALUE': '0.048042',
'MEASUREMENT_DATE': '2019/03/06 4:24:31 PM'}],
'param2': [{'CHART_VALUE': '38',
'MEASUREMENT_DATE': '2019/03/06 4:24:31 PM'},
{'CHART_VALUE': '42.25',
'MEASUREMENT_DATE': '2019/03/08 10:57:18 AM'}]}}
推荐阅读
- innerhtml - 有没有办法搜索搜索所有字符(包括“<”字符)的字符串?
- python - 如何合并修改数据框中数据的列
- vulkan - Ubuntu 20 上的 Vulkan 验证层
- jhipster - 删除 JDL 上的 DTO 和服务后不清理代码
- perforce - Perforce - p4 同步命令不起作用
- gatsby - 来自阵列的动态图像
- firebase - 更改页面 Flutter 时丢失 GoogleSignInAccount
- amazon-web-services - 将消息从一个帐户中的 lambda 发送到另一个帐户中的 SQS
- python - 如何在自定义类中重载双重比较?(x < 我的对象 < y)
- javascript - 未知命令:运行 npm 命令时的“pkg”