Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中创建两级嵌套JSON?_Python_Json_Nested - Fatal编程技术网

如何在Python中创建两级嵌套JSON?

如何在Python中创建两级嵌套JSON?,python,json,nested,Python,Json,Nested,我的数据是这样的 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,pa

我的数据是这样的

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'}]}}

谢谢,这正是我需要的!!!有一个问题:有没有一种方法可以不基于列顺序来设置变量?我不完全确定你在问什么,但我认为可能是基于标题的列解释,而不是假定列顺序?如果是这样的话,使用csv.DictReader是我的目标