【问题标题】:Python: Convert multiple columns of CSV file to nested JsonPython:将CSV文件的多列转换为嵌套的Json
【发布时间】:2018-08-01 19:22:59
【问题描述】:

这是我的多列输入 CSV 文件,我想将此 csv 文件转换为包含部门、部门 ID 和一个名为 customer 的嵌套字段的 json 文件,并将第一个和最后一个嵌套到该字段。

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 作为 grouby 键。

【问题讨论】:

  • 尝试运行您的示例代码会得到KeyError: 'group'
  • 抱歉,我遇到了 stackoverflow 提交错误,将组更改为部门,将 groupID 更改为部门ID。请在 CSV 文件中将部门更改为组,将部门 ID 更改为部门。对不起。

标签: python json csv nested multiple-columns


【解决方案1】:

问题是你混合了键名,所以这一行 "user": [{k:v for k, v in d.items() if k != 'group'} for d in list(g)] 没有从您的字典中正确删除它们,没有这样的键。所以什么都没有被删除。

我不完全理解您想要什么键,因此以下示例假定 data.csv 看起来与您的问题 departmentdepartmentID 完全相同,但脚本将其转换为 groupgroupID

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'}]}]

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

【讨论】:

  • 有效。非常感谢。
  • 很抱歉给您带来了困惑。 “组”应更改为“部门”,“组ID”应更改为“部门ID”。
猜你喜欢
  • 2017-05-02
  • 1970-01-01
  • 2018-10-27
  • 2021-05-17
  • 2022-09-30
  • 1970-01-01
  • 2020-12-04
  • 2019-02-13
相关资源
最近更新 更多