[英]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.