繁体   English   中英

使用嵌套数组将Csv转换为JSON

[英]Convert Csv to JSON with nested array

我有一个CSV文件

group, first, last
fans, John, Smith
fans, Alice, White
students, Ben, Smith
students, Joan, Carpenter
...

输出JSON文件需要以下格式:

[
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
},
{
  "group" : "students",
  "user" : [
    {
      "first" : "Ben",
      "last" :  "Smith"
    },
    {
      "first" : "Joan",
      "last" :  "Carpenter"
    }
  ]
}
]

简短答案
按照文档中的说明使用itertools.groupby

长答案
这是一个多步骤的过程。

首先将CSV放入dict list中:

from csv import DictReader
with open('data.csv') as csvfile:
    r = DictReader(csvfile, skipinitialspace=True)
    data = [dict(d) for d in r]

groupby需要排序的数据,因此定义一个函数来获取密钥,然后像这样传递它:

def keyfunc(x):
    return x['group']

data = sorted(data, key=keyfunc)

最后,调用groupby ,提供排序后的数据和关键功能:

from itertools import groupby
groups = []
for k, g in groupby(data, keyfunc):
    groups.append({
        "group": k,
        "user": [{k:v for k, v in d.items() if k != 'group'} for d in list(g)]
    })

这将遍历您的数据,并且每次密钥更改时,它都会放入for块并执行该代码,从而提供k (该组的密钥)和g (所属的dict对象)。 在这里,我们只将它们存储在列表中以备后用。

在此示例中, user密钥使用一些相当密集的理解来从user每一行中删除group密钥。 如果您可以使用少量的额外数据,那么可以将整行简化为:

"user": list(g)

结果看起来像这样:

[
  {
    "group": "fans",
    "user": [
      {
        "first": "John",
        "last": "Smith"
      },
      {
        "first": "Alice",
        "last": "White"
      }
    ]
  },
  {
    "group": "students",
    "user": [
      {
        "first": "Ben",
        "last": "Smith"
      },
      {
        "first": "Joan",
        "last": "Carpenter"
      }
    ]
  }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM