【问题标题】:Python csv to json (D3)Python csv 到 json (D3)
【发布时间】:2015-06-09 18:59:56
【问题描述】:

我试图从我生成的 .csv 创建一个 JSON 文件(用于 D3),如下所示:

uat,soe1.1,deploy-mash-app40-uat,3.8.2.8,org.cgl.kfs.mas.mashonline,mashonline-ui-static
uat,soe1.1,deploy-mash-app22-uat-has,1.0.1.RC1,org.cgl.kfs.mas.mashonline,realtime_balances_mims_feeder
stg,soe1.1,deploy-coin-app2-stg,1.1.2,org.mbl.coin.ui.visormobile,vm-web-ui
stg,soe1.1,deploy-coin-app2-stg,1.2.14,org.mbl.coin.ui.factfind,factfind-web-ui

尝试了几种方法,包括 StackOverflow 中的几乎所有帖子。 我想要的 D3 JSON 是这样的:

{
    "name": "flare",
    "children": [
        {
            "name": "uat",
            "children": [
                {
                    "name": "soe1.1",
                    "children": [
                        {
                            "name": "deploy-mash-app40-uat",
                            "children": [
                                {
                                    "name": "mashonline-ui-static",
                                    "children": [
                                        {
                                            "name": "com.cgl.bfs.mas.mashonline",
                                            "size": 3938
                                        },
                                        {
                                            "name": "3.8.2.8",
                                            "size": 3812
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            "name": "deploy-mash-app22-uat-has",
                            "children": [
                                {
                                    "name": "realtime_balances_mims_feeder",
                                    "children": [
                                        {
                                            "name": "1.0.1.RC1",
                                            "size": 3534
                                        },
                                        {
                                            "name": "com.cgl.bfs.mas.mashonline",
                                            "size": 5731
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "name": "stg",
            "children": [
                {
                    "name": "soe1.1",
                    "children": [
                        {
                            "name": "deploy-coin-app2-stg",
                            "children": [
                                {
                                    "name": "vm-web-ui",
                                    "children": [
                                        {
                                            "name": "1.1.2",
                                            "size": 3812
                                        },
                                        {
                                            "name": "com.mbl.coin.ui.visormobile",
                                            "size": 6714
                                        }
                                    ]
                                },
                                {
                                    "name": "factfind-web-ui",
                                    "children": [
                                        {
                                            "name": "1.2.14",
                                            "size": 5731
                                        },
                                        {
                                            "name": "com.mbl.coin.ui.factfind",
                                            "size": 7840
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

基本上,将最后两列值作为第 4 列的兄弟。 在此先感谢(我也是 python 的新手)。

试过了 Link1 Link2 和许多其他链接,但我无法使其工作

我运行的代码如下(感谢上述链接之一),但我发现在到达单元格时很难添加“名称”、“孩子”节点。

import json
import csv

tree = {}
name = "name"
children = "children"
reader = csv.reader(open("cleaned_new_test.txt", 'rb'))
reader.next()
for row in reader:
    print tree
    subtree = tree
    for i, cell in enumerate(row):
        if cell:
            if cell not in subtree:
                subtree[cell] = {} if i<len(row)-1 else 1
                print subtree
            subtree = subtree[cell]

print json.dumps(tree, indent=4)

【问题讨论】:

  • D3 也可以读取 csv 文件,如果这有帮助 see here
  • 你从哪里得到size
  • @jedwards 大小只是我随机添加的一个值,只是为了符合 D3 的格式。现在没有任何意义。
  • @RúnarBerg 谢谢,但 D3 似乎没有提供帮助将 csv 格式化为我们自己的自定义格式的 json。
  • 你能验证你写的json就是你想要的json——具体来说,输出的后“一半”的结构与第一个不同。 org.mbl.coin.ui.factfind 看起来像是重复的。在前半部分,您将第 4 列和第 5 列作为第 6 列的后代。在第三个条目中,将第 4 列和第 6 列作为第 5 列的后代。在最后一个条目中,将第 5 列和第 6 列作为第 5 列的后代.

标签: python json csv d3.js


【解决方案1】:

这是从 csv 文件获取 json 的一种方法:

import csv
from collections import OrderedDict
import json

def fmt(d):
    l = []
    for (k,v) in d.items():
        j = OrderedDict()
        j['name'] = k
        if isinstance(v, dict):
            j['children'] = fmt(v)
        elif isinstance(v, list):
            for (k,v) in v:
                j[k] = v
        l.append(j)
    return l

# Build OrderedDict
d1 = OrderedDict()
with open('input.txt') as f:
    reader = csv.reader(f, )
    for row in reader:
        print(row)
        # Extract the columns you want to use as "leaves"
        leaves = [row[-2], row[-3]]
        for l in leaves: row.remove(l)
        # Build a dictionary based on remaining row elements
        ctx = d1
        for e in row:
            if e not in ctx: ctx[e] = OrderedDict()
            ctx = ctx[e]
        # Re-insert leaves
        for l in leaves:
            ctx[l] = None

print(json.dumps(d1, indent=4))
print('---')


# Insert missing items (ctx = context)
ctx = d1['uat']['soe1.1']['deploy-mash-app40-uat']['mashonline-ui-static']
ctx['org.cgl.kfs.mas.mashonline']   = [('size', 3938)]
ctx['3.8.2.8']                      = [('size', 3812)]

ctx = d1['uat']['soe1.1']['deploy-mash-app22-uat-has']['realtime_balances_mims_feeder']
ctx['1.0.1.RC1']                    = [('size', 3534)]
ctx['org.cgl.kfs.mas.mashonline']   = [('size', 5731)]

ctx = d1['stg']['soe1.1']['deploy-coin-app2-stg']['vm-web-ui']
ctx['1.1.2']                        = [('size', 3812)]
ctx['org.mbl.coin.ui.visormobile']  = [('size', 6714)]

ctx = d1['stg']['soe1.1']['deploy-coin-app2-stg']['factfind-web-ui']
ctx['1.2.14']                       = [('size', 5731)]
ctx['org.mbl.coin.ui.factfind']     = [('size', 7840)]

# Wrap "formatted" in another dictionary
d2 = {"name": "flare", "children": fmt(d1)}

j = json.dumps(d2, indent=4)
print(j)

输出:

{ “名称”:“耀斑”, “孩子们”: [ { “名称”:“uat”, “孩子们”: [ { “名称”:“soe1.1”, “孩子们”: [ { “名称”:“部署-mash-app40-uat”, “孩子们”: [ { "name": "mashonline-ui-static", “孩子们”: [ { “名称”:“org.cgl.kfs.mas.mashonline”, “大小”:3938 }, { “名称”:“3.8.2.8”, “大小”:3812 } ] } ] }, { “名称”:“部署-mash-app22-uat-has”, “孩子们”: [ { "name": "realtime_balances_mims_feeder", “孩子们”: [ { “名称”:“org.cgl.kfs.mas.mashonline”, “尺寸”:5731 }, { “名称”:“1.0.1.RC1”, “大小”:3534 } ] } ] } ] } ] }, { “名称”:“stg”, “孩子们”: [ { “名称”:“soe1.1”, “孩子们”: [ { “名称”:“部署硬币app2-stg”, “孩子们”: [ { “名称”:“vm-web-ui”, “孩子们”: [ { “名称”:“org.mbl.coin.ui.visormobile”, “大小”:6714 }, { “名称”:“1.1.2”, “大小”:3812 } ] }, { "name": "factfind-web-ui", “孩子们”: [ { “名称”:“org.mbl.coin.ui.factfind”, “尺寸”:7840 }, { “名称”:“1.2.14”, “尺寸”:5731 } ] } ] } ] } ] } ] }

这不是最漂亮的,但它完成了工作。

一些注意事项:

  • 添加size 元素在事实是丑陋的之后,可能有更好的方法来做到这一点。 (我指的是以注释“插入缺失项”开头的代码)。在本节中,您可以指定其他键:值对以将其添加为 (key,value) 2 元组列表。
  • 本节可以写成:

    # Insert missing items (ctx = context)
    d1['uat']['soe1.1']['deploy-mash-app40-uat']['mashonline-ui-static']['org.cgl.kfs.mas.mashonline']              = [('size', 3938)]
    d1['uat']['soe1.1']['deploy-mash-app40-uat']['mashonline-ui-static']['3.8.2.8']                                 = [('size', 3812)]
    d1['uat']['soe1.1']['deploy-mash-app22-uat-has']['realtime_balances_mims_feeder']['1.0.1.RC1']                  = [('size', 3534)]
    d1['uat']['soe1.1']['deploy-mash-app22-uat-has']['realtime_balances_mims_feeder']['org.cgl.kfs.mas.mashonline'] = [('size', 5731)]
    d1['stg']['soe1.1']['deploy-coin-app2-stg']['vm-web-ui']['1.1.2']                                               = [('size', 3812)]
    d1['stg']['soe1.1']['deploy-coin-app2-stg']['vm-web-ui']['org.mbl.coin.ui.visormobile']                         = [('size', 6714)]
    d1['stg']['soe1.1']['deploy-coin-app2-stg']['factfind-web-ui']['1.2.14']                                        = [('size', 5731)]
    d1['stg']['soe1.1']['deploy-coin-app2-stg']['factfind-web-ui']['org.mbl.coin.ui.factfind']                      = [('size', 7840)]
    

    (没有ctx 参考资料)。我只是使用定义的ctx 作为字典结构中的一个位置,然后用它来设置更深的字典值,使行更短且更易于管理。

  • 预期的 json 好多了,但还是有点偏离。即,您指定像 com.cgl.bfs.mas.mashonline 这样的标识符,但您的 csv 有 org.cgl.bfs.mas.mashonline(“com”与“org”)。此外,您的 json 中“叶子”元素的顺序不一致。在我的脚本输出的 json 中,第 5 列出现在第 4 列之前。在您的 json 中,第一个元素以这种方式出现,但最后三个元素以交换的顺序出现(4 在 5 之前)。如果您想要这个交换的订单,请更改:

    leaves = [row[-2], row[-3]]
    

    leaves = [row[-3], row[-2]]
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 2017-07-29
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多