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

时间:2018-07-27 18:32:50

标签: python arrays json csv nested

我有一个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"
    }
  ]
}
]

1 个答案:

答案 0 :(得分:1)

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

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

首先将CSV放入list的{​​{1}}中:

dict

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(该组的密钥)和{{1} }(属于它的k对象)。在这里,我们只是将它们存储在列表中以备后用。

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

group

结果如下:

user