将 csv 转换为 JSON 树结构?

2024-02-24

我读了这些问题:

  • csv数据到d3中的嵌套json树 https://stackoverflow.com/questions/19043561/csv-data-to-nested-json-tree-in-d3
  • 在python中从csv列表创建一个json树 https://stackoverflow.com/questions/12616229/create-a-json-tree-from-csv-list-in-python
  • 如何在 Python 中从列表层次结构创建 JSON 树 https://stackoverflow.com/questions/7408615/how-to-create-a-json-tree-from-a-tabulated-hierarchy-in-python
  • Python csv 到嵌套 JSON [关闭] https://stackoverflow.com/questions/35969611/python-csv-to-nested-json

但是我仍然无法将 csv 文件转换为 JSON 的层次结构。我在 stackoverflow 上找到的所有脚本都是针对特定问题的。假设必须对三个变量进行分组:

condition   target  sub
oxygen      tree    G1
oxygen      tree    G2
water       car     G3
water       tree    GZ
fire        car     GTD
oxygen      bomb    GYYS

这将产生一个像这样的 JSON 文件(据我尝试):

oxygen
    - tree  
        - G1
        - G2
    - bomb
        -GYYS
water 
    - car
        - G3
    - tree
        -GZ
fire 
    - car   
        - GTD

这些必须分组在嵌套结构中,例如:

    {
   "name": "oxygen",
   "children": [
    {
     "name": "tree",
     "children": [
      {"name": "G1"},
      {"name": "G2"},
      {"name": "GYYS"}
     ]
    },
    {
     "name": "bomb",
      "children": [
      {"name": "GYYS"}
     ]
    }
    ]
}
etc.

我尝试了这个网站上的每个脚本,但是我无法创建一个可以创建这样的flare.json 的通用函数。我可以发布我的代码,但这就像上面提供的链接一样。所以我要求一个简单的代码(或一个可以帮助我的示例)将其转换为类似flare.JSON 的结构。


Using 默认字典 https://docs.python.org/2/library/collections.html#collections.defaultdict来自收藏品 https://docs.python.org/2/library/collections.html#module-collections标准库使许多具有层次结构的问题变得简单且可解决。因此,我为您的问题开发了一个示例解决方案。但在运行脚本之前,请确保您有逗号分隔的 csv 文件(名为 test.csv),或者您可以更改csv阅读器 https://docs.python.org/3.5/library/csv.html#module-csv逻辑就在那里。

这是我测试过脚本的 csv 文件。

condition, target, sub, dub
oxygen,tree,G1,T1
oxygen,tree,G2,T1
oxygen,tree,G2,T2
water,car,G3,T1
water,tree,GZ,T1
water,tree,GZ,T2
fire,car,GTD,T3
oxygen,bomb,GYYS,T1

从技术上讲,该脚本应该适用于任何类型、具有各种尺寸的 csv 文件。但你需要亲自测试一下才能确定。

import csv
from collections import defaultdict


def ctree():
    """ One of the python gems. Making possible to have dynamic tree structure.

    """
    return defaultdict(ctree)


def build_leaf(name, leaf):
    """ Recursive function to build desired custom tree structure

    """
    res = {"name": name}

    # add children node if the leaf actually has any children
    if len(leaf.keys()) > 0:
        res["children"] = [build_leaf(k, v) for k, v in leaf.items()]

    return res


def main():
    """ The main thread composed from two parts.

    First it's parsing the csv file and builds a tree hierarchy from it.
    Second it's recursively iterating over the tree and building custom
    json-like structure (via dict).

    And the last part is just printing the result.

    """
    tree = ctree()
    # NOTE: you need to have test.csv file as neighbor to this file
    with open('test.csv') as csvfile:
        reader = csv.reader(csvfile)
        for rid, row in enumerate(reader):

            # skipping first header row. remove this logic if your csv is
            # headerless
            if rid == 0:
                continue

            # usage of python magic to construct dynamic tree structure and
            # basically grouping csv values under their parents
            leaf = tree[row[0]]
            for cid in range(1, len(row)):
                leaf = leaf[row[cid]]

    # building a custom tree structure
    res = []
    for name, leaf in tree.items():
        res.append(build_leaf(name, leaf))

    # printing results into the terminal
    import json
    print(json.dumps(res))


# so let's roll
main()

这是结果中的 json 段:

{
    "name": "oxygen",
    "children": [
      {
        "name": "tree",
        "children": [
          {
            "name": "G2",
            "children": [
              {
                "name": "T2"
              },
              {
                "name": "T1"
              }
            ]
          },
          {
            "name": "G1",
            "children": [
              {
                "name": "T1"
              }
            ]
          }
        ]
      },
      {
        "name": "bomb",
        "children": [
          {
            "name": "GYYS",
            "children": [
              {
                "name": "T1"
              }
            ]
          }
        ]
      }
    ]
  }

如果您还有任何其他疑问和问题,请告诉我。 快乐蟒蛇;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 csv 转换为 JSON 树结构? 的相关文章

随机推荐

  • Dropbox 中未同步的 Git 存储库

    我有一个 git 存储库 和工作目录 存储在我的 Dropbox 中 这样我就可以在计算机之间来回移动 而无需提交或存储 阅读 完全不需要任何努力 这一切都很有效 除了一个小烦恼正在变成一个大烦恼之外 每隔一段时间 我会让一台计算机处于完全
  • 如何以编程方式确定当前类的Java字节码版本? [复制]

    这个问题在这里已经有答案了 我遇到的情况是 部署平台是 Java 5 并且开发是在 Java 6 下使用 Eclipse 进行的 我们建立了一个在开始处理给定项目时创建新工作区的过程 因此 所需步骤之一是将编译器级别设置为 Java 5 这
  • 在 AWS Lambda Layers 中找到等效的环境变量?

    我正在 AWS 上编写一个无服务器应用程序 我已将该应用程序分解为许多 Clo udFormation 堆栈 我正在使用 CDK Python 中 创建 CF 堆栈来部署应用程序 当然 我的 lambda 函数的核心要求是能够记录事件 为了
  • 如何获取 ScrollController 的完整大小

    我已将 ScrollController 附加到 SliverAppBar SliverList 的 CustomScrollView 在默认情况下 我会使用reverse true和animateTo 0 0 将滚动移动到添加的最后一个元
  • 没有为“listen ... ssl”指令定义“ssl_certificate”

    我正在尝试为我的网站配置 nginx 服务器 我正在使用以下代码来配置我的服务器 如果我为 www fastenglishacademy fr 443 服务器块添加 default server 它就会起作用 但在这种情况下 我的所有子域也
  • Firebase webpack+babel 功能未部署

    是否可以使 firebase 函数与 webpack 和 babel 一起使用 我们需要在服务器端重用现有的 ES6 类 但我们无法编辑这些类 因此我们需要转译它们以使其在 Node 中工作 花了两天时间学习相关教程 但我遇到了一个问题 即
  • 如何防止用户在iOS上截取应用程序的屏幕截图?

    我想防止用户对我的应用程序进行屏幕截图 并在最近的项目上隐藏其内容 你知道相当于Android的吗FLAG SECURE特征 https developer android com reference android view Window
  • R:创建一个函数来识别任意百分位数

    我正在使用 R 编程语言 我有以下数据集 library dplyr var1 rnorm 10000 100 100 var2 rnorm 10000 100 100 var3 rnorm 10000 100 100 var4 rnorm
  • Crystal 报表中的动态列

    我需要创建动态报告 如果在数据库中添加列 则该列应该自动反映在水晶报告中 我想知道水晶报告中是否可以使用动态列 如果是的话 如何实现 据我所知 通过在数据库中添加一列 您无法通过数据表在水晶报告上获取它 但您可以通过存储过程获取它 但您必须
  • `int` 是原子类型吗?

    Quoting gnu https www gnu org software libc manual html node Atomic Types html 实际上 您可以假设 int 是原子的 您还可以假设指针类型是原子的 非常方便 这两
  • 如何将 python 集合转换为 numpy 数组?

    我在 python 中使用集合操作来执行两个 numpy 数组之间的对称差异 然而 结果是一个集合 我需要将其转换回 numpy 数组才能继续 有没有办法做到这一点 这是我尝试过的 a numpy array 1 2 3 4 5 6 b n
  • .NET 中的 BODMAS 原理

    今天我发现 NET 框架在进行计算时遵循 BODMAS 操作顺序 即按以下顺序进行计算 Brackets Orders Division 乘法 Addition 减法 但是我四处搜索 找不到任何文档来证实 NET确实遵循这个原则 哪里有这样
  • 对广播接收器进行单元测试?

    这是我项目中的一个 BroadcastReceiver 我正在对其进行单元测试 当用户拨打电话时 它会获取电话号码 并设置启动新活动的意图 并传入电话号码 public class OutgoingCallReceiver extends
  • sonar-maven-plugin:无法设置sonar.sources src / main / resources

    我的 maven sonar 设置有问题 我需要将所有项目文件包含在src 主 java and src 主 资源这样 SonarQube 将显示我所有文件的结果 但排除其中的一些文件src main resources static 文件
  • 我如何理解 rbind 的警告?

    如果我有两个具有相同列名的 data frame 我可以使用 rbind 来创建单个数据框 但是 如果我有一个是一个因子 另一个是一个整数 我会收到如下警告 警告消息 在 lt factor tmp ri 值 c 1L 1L 0L 0L 0
  • Eclipse、Android 插件、安装新软件只是显示“待处理”

    我正在尝试按照此处的说明安装适用于 Eclipse 的 Android 插件 32 位 Windows 7 Eclipse Java Indigo 版本 迈克 普拉特 http www mikeplate com 2009 10 27 ge
  • 如何将数据随机分成三个相等大小?

    我有一个包含来自三个不同项目的 9558 行的数据集 我想将这个数据集随机分成三个相等的组 并为每个组分配一个唯一的 ID 以便Project1 Project 2 Project3变成Project1 Project2 and Proje
  • postgresql:将 bytea 转换为 bigint

    我必须将查询的 bytea 条目转换为 bigint 这怎么可能做到呢 更多信息 我有一个休眠存储库 如下所示 Query value update Sample Table set other id 1 where id 2 native
  • r 中字符变量名称的循环

    我有一个变量列表 例如 a1 a2 a3 然后我想对这些变量进行循环 例如赋值 我尝试了粘贴 它只给出了像 a1 这样的字符 这不是我真正想要的 谁能提供解决方案吗 我们可以用mget获取 a 中的值list lst lt mget pas
  • 将 csv 转换为 JSON 树结构?

    我读了这些问题 csv数据到d3中的嵌套json树 https stackoverflow com questions 19043561 csv data to nested json tree in d3 在python中从csv列表创建