【问题标题】:Convert Csv to JSON with nested array使用嵌套数组将 Csv 转换为 JSON
【发布时间】:2018-07-27 18:32:49
【问题描述】:

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

【问题讨论】:

  • 对不起,csv文件有3列,组,第一,最后
  • 那么,你的问题是什么?
  • 如何将此csv转换为带有嵌套数组的json文件
  • 我的意思是你的代码有什么问题?你使用什么语言?
  • 对不起,我正在使用 python。我的问题是如何嵌套数组。我是否需要创建一个包含 first 和 last 以及 ...的 json 文件?策略有点混乱。我可以创建一个包含三个字段的 json 文件:组、第一个和最后一个,但是如何使用组对第一个和最后一个进行分组

标签: python arrays json csv nested


【解决方案1】:

简答
使用itertools.groupby,如documentation 中所述。

长答案
这是一个多步骤的过程。

首先将您的 CSV 转换为 listdict

from csv import DictReader
with open('data.csv') as csvfile:
    r = DictReader(csvfile, skipinitialspace=True)
    data = [dict(d) for d in r]

groupby需要排序后的数据,所以定义一个函数来获取key,然后像这样传入:

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(该组的密钥)和gdict属于它的对象)。在这里,我们只是将它们存储在一个列表中以备后用。

在此示例中,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"
      }
    ]
  }
]

【讨论】:

  • 谢谢。我得到了 NameError: name 'groupby' is not defined。你知道它有什么问题吗?
  • 我错过了一个导入 - from itertools import groupby。现已修复。
  • 如果我有另一列称为组 ID,如何同时按组和组 ID 对用户进行分组?
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 2020-07-01
  • 2022-01-07
  • 2019-03-16
  • 2021-08-26
  • 2018-01-07
  • 2020-04-02
相关资源
最近更新 更多