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