csv python的分层JSON

2024-05-16 16:06:39 发布

您现在位置:Python中文网/ 问答频道 /正文

在一个结构化的csv数据集中:

Name,code,count
Adam,01,48
Bill,01,32
Chris,01,4
Carl,01.01,5
Dave,01.01,1
David,01.01,1
Eric,01.01.01,26
Earl,01.01.01.01,2
Frank,01.01.01.01,2
Greg,01.01.01.02,2
Harold,01.01.01.03,7
Ian,01.01.01.03,3
Jack,01.01.01.03,1
John,01.01.01.04,10
Kyle,01.01.01.04,2
Larry,01.01.03.01,3
Mike,01.01.03.01.01,45
Nick,01.01.03.01.01.01,1
Oliver,01.01.03.01.01.02,16
Paul,01.01.03.01.01.03,23

我想用python编写一个字典,其中“name”和“count”是键:值对(这很简单),但我想根据“代码”编号组织一个层次结构。i、 e01.01是01的子级,我不知道如何迭代数据来实现这一点。我最终想对整个结构做一个json转储,但是如何构造层次结构才是让我陷入困境的原因。非常感谢任何帮助。在


Tags: csv数据name层次结构countcodechris结构化
3条回答

我想你想做一些标准的树结构,在那里你可以访问一个树结构,当用路径访问时,会自动创建丢失的节点。在

像这样。在

class Node:
    def __init__( self, parent=None ):
        self.parent = parent
        self.store = {}
        self.children = {}

    def create_child( self, child_name ):
        self.children[ child_name ] = Node( self )

    #ancestry_line is a list of names
    def recursive_get_child( self, ancestry_line_names ):
        if len(ancestry_line_names) == 0:
            return self
        else:
            next_ancestor = ancestry_line_names[0]
            other_ancestors = ancestry_line_names[1:]
            if next_ancestor not in self.children:
                self.create_child( next_ancestor )
            return self.children[ next_ancestor ].recursive_get_child( other_ancestors )

您只需创建一个根节点,并通过路径从中访问正确的节点。在

^{pr2}$

然后,您可以在Node中创建一个方法,将节点结构转换为可在json中转储的纯字典结构。在

下面的代码片段查找树的所有节点,而不实际创建一个。Python中的树和链表实现效率低下(Beazley)。在

from itertools import groupby
import csv

with open('csvfile.csv') as f:
    reader = csv.DictReader(f)

groups = groupby(reader, key=lambda row: row['code'])
nodes = {code: {item['Name']: item['count'] for item in group} for code,group in groups}

{'01': {'Adam': '48', 'Bill': '32', 'Chris': '4'},
 '01.01': {'Carl': '5', 'Dave': '1', 'David': '1'},
 '01.01.01': {'Eric': '26'},
 '01.01.01.01': {'Earl': '2', 'Frank': '2'},
 '01.01.01.02': {'Greg': '2'},
 '01.01.01.03': {'Harold': '7', 'Ian': '3', 'Jack': '1'},
 '01.01.01.04': {'John': '10', 'Kyle': '2'},
 '01.01.03.01': {'Larry': '3'},
 '01.01.03.01.01': {'Mike': '45'},
 '01.01.03.01.01.01': {'Nick': '1'},
 '01.01.03.01.01.02': {'Oliver': '16'},
 '01.01.03.01.01.03': {'Paul': '23'}}

在Python中实现树结构的一种简单而优雅的方法是使用递归^{}

import csv, json
from collections import defaultdict

def tree():
    return defaultdict(tree)

d = tree()

with open('data.txt', 'rb') as f:
    reader = csv.reader(f, delimiter=',')

    for name, code, count in list(reader)[1:]:
        path = code.split('.')
        iter_node = d
        for node in path:
            iter_node = iter_node[node]
        iter_node['values'][name] = count

print json.dumps(d, indent=2)

{
  "01": {
    "values": {
      "Chris": "4", 
      "Bill": "32", 
      "Adam": "48"
    },
    "01": {
      "values": {
        "Dave": "1", 
        "Carl": "5", 
        "David": "1"
      },
      "03": {
        "01": {
          "01": {
            "02": {
              "values": {
                "Oliver": "16"
              }
            }, 
            "03": {
              "values": {
                "Paul": "23"
              }
            }, 
            "01": {
              "values": {
                "Nick": "1"
              }
            }, 
            "values": {
              "Mike": "45"
            }
          }, 
          "values": {
            "Larry": "3"
          }
        }
      }, 
      "01": { 
        "values": {
          "Eric": "26"
        }, 
        "02": {
          "values": {
            "Greg": "2"
          }
        }, 
        "03": {
          "values": {
            "Harold": "7", 
            "Ian": "3", 
            "Jack": "1"
          }
        }, 
        "01": {
          "values": {
            "Earl": "2", 
            "Frank": "2"
          }
        },
        "04": {
          "values": {
            "John": "10", 
            "Kyle": "2"
          }
        }
      }
    }
  }
}

相关问题 更多 >