这是具有多列的输入CSV文件,我想将此csv文件转换为json文件,其中包含部门、departmentID和一个名为customer的嵌套字段,并将第一个和最后一个嵌套字段放在此字段中。
department, departmentID, first, last
fans, 1, Caroline, Smith
fans, 1, Jenny, White
students, 2, Ben, CJ
students, 2, Joan, Carpenter
...
输出我需要的json文件:
[
{
"department" : "fans",
"departmentID: "1",
"customer" : [
{
"first" : "Caroline",
"last" : "Smith"
},
{
"first" : "Jenny",
"last" : "White"
}
]
},
{
"department" : "students",
"departmentID":2,
"user" :
[
{
"first" : "Ben",
"last" : "CJ"
},
{
"first" : "Joan",
"last" : "Carpenter"
}
]
}
]
我的代码:
from csv import DictReader
from itertools import groupby
with open('data.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['group'], r['groupID'])):
groups.append({
"group": k[0],
"groupID": k[1],
"user": [{k:v for k, v in d.items() if k != 'group'} for d in list(g)]
})
uniquekeys.append(k)
pprint(groups)
我的问题是: groupID在数据中显示了两次,传入和传出嵌套的json。我想要的是group和groupID作为组密钥。
发布于 2018-08-02 05:03:18
问题是您混淆了键的名称,所以"user": [{k:v for k, v in d.items() if k != 'group'} for d in list(g)]
这一行没有从字典中正确地去掉它们,因为没有这样的键。所以没有任何东西被删除。
我不完全理解您想要什么密钥,所以下面的示例假设data.csv
与您的问题中的department
和departmentID
完全相同,但是脚本将其转换为group
和groupID
from csv import DictReader
from itertools import groupby
from pprint import pprint
with open('data.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['department'], r['departmentID'])):
groups.append({
"group": k[0],
"groupID": k[1],
"user": [{k:v for k, v in d.items() if k not in ['department','departmentID']} for d in list(g)]
})
uniquekeys.append(k)
pprint(groups)
输出:
[{'group': 'fans',
'groupID': '1',
'user': [{'first': 'Caroline', 'last': 'Smith'},
{'first': 'Jenny', 'last': 'White'}]},
{'group': 'students',
'groupID': '2',
'user': [{'first': 'Ben', 'last': 'CJ'},
{'first': 'Joan', 'last': 'Carpenter'}]}]
我使用了不同的键,所以哪一行做什么很明显,并且很容易为输入或输出中的不同键自定义它
https://stackoverflow.com/questions/51640880
复制相似问题