首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:将CSV文件的多列转换为嵌套Json

Python:将CSV文件的多列转换为嵌套Json
EN

Stack Overflow用户
提问于 2018-08-02 03:23:00
回答 1查看 2.1K关注 0票数 0

这是具有多列的输入CSV文件,我想将此csv文件转换为json文件,其中包含部门、departmentID和一个名为customer的嵌套字段,并将第一个和最后一个嵌套字段放在此字段中。

代码语言:javascript
复制
department, departmentID, first, last
fans, 1, Caroline, Smith
fans, 1, Jenny, White
students, 2, Ben, CJ
students, 2, Joan, Carpenter
...

输出我需要的json文件:

代码语言:javascript
复制
[
{
"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"
    }
  ]
}
]

我的代码:

代码语言:javascript
复制
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作为组密钥。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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与您的问题中的departmentdepartmentID完全相同,但是脚本将其转换为groupgroupID

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
[{'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'}]}]

我使用了不同的键,所以哪一行做什么很明显,并且很容易为输入或输出中的不同键自定义它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51640880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档