python實現(xiàn)樹形結(jié)構(gòu)的json文件

需求:

在做樹形可視化圖形時,需要相應的json文件為樹形結(jié)構(gòu)。本例為將所有IP進行一個統(tǒng)計,合并同類項,之后根據(jù)IP的四個字段分為四層。第一層為第一個字段,第二層為第二個字段,以此類推,總共四層。
數(shù)據(jù)格式類似下圖:


image.png

實現(xiàn)思路:

  • 1.將IP統(tǒng)計后的結(jié)果以dataframe的數(shù)據(jù)結(jié)構(gòu)存儲;
  • 2.定義兩種節(jié)點:
    非葉子節(jié)點:
node={"name":"","children":[]}

葉子節(jié)點:

leaf={"name":"","size":0}
    1. 對所有IP進行一次遍歷,遍歷所有IP的第一個字段,得到不同的第一個字段,并生成一個非葉子節(jié)點。加入列表中。
    1. 對所有IP進行第二次遍歷,遍歷第二個字段,生成相應的非葉子節(jié)點,并匹配對應的第一個字段,插入到列表中。
    1. 對所有IP進行第三次遍歷,遍歷第三個字段,生成相應的非葉子節(jié)點,并分別匹配第一個字段和第二個字段,插入到列表中。
    1. 對所有IP進行第四次遍歷,遍歷第四個字段,生成相應的葉子節(jié)點,并分別匹配第一個字段、第二個字段、第三個字段,插入到列表中。
    1. 最后做格式的微調(diào),如單引號變?yōu)殡p引號等。

實現(xiàn)代碼:

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 29 15:06:39 2017

@author: gly
"""

import pandas as pd

df=pd.read_csv('output.csv')
#源IP計數(shù)
srcIpCounts=df[u'firstSeenSrcIp'].value_counts()
srcIpCounts=pd.DataFrame(srcIpCounts)

#定義節(jié)點,node為非葉子節(jié)點,leaf為葉子節(jié)點
node={"name":"","children":[]}
leaf={"name":"","size":0}
result=[]
#第一次遍歷,計算IP的所有第一個數(shù)值的種類并生成Node節(jié)點
ip1Num=[]
for index,row in srcIpCounts.iterrows():
    name=index.split(".")[0]
    if name not in ip1Num:
        ip1Num.append(name)
        node={"name":name,"children":[]}
        result.append(node)

#第二次遍歷,計算IP前兩位的不同種類并生成Node節(jié)點歸到第一次遍歷對應的結(jié)果中
ip2Num=[]
for index,row in srcIpCounts.iterrows():
    name1=index.split(".")[0]
    name2='.'.join(index.split(".")[0:2])
    if name2 not in ip2Num:
        ip2Num.append(name2)
        node={"name":name2,"children":[]}
        for i in result:
            if i["name"]==name1:
                i["children"].append(node)
                break


#第三次遍歷,計算IP前三位的不同種類并生成Node節(jié)點歸到第二次遍歷對應的結(jié)果中
ip3Num=[]
for index,row in srcIpCounts.iterrows():
    name1=index.split(".")[0]
    name2='.'.join(index.split(".")[0:2])
    name3='.'.join(index.split(".")[0:3])
    if name3 not in ip3Num:
        ip3Num.append(name3)
        node={"name":name3,"children":[]}
        for i in result:
            if i["name"]==name1:
                for j in i["children"]:
                    if j["name"]==name2:
                        j["children"].append(node)
                        break

            
#第四次遍歷,計算IP所有位的不同種類并生成leaf節(jié)點歸到上一次遍歷對應的結(jié)果中
for index,row in srcIpCounts.iterrows():
    name1=index.split(".")[0]
    name2='.'.join(index.split(".")[0:2])
    name3='.'.join(index.split(".")[0:3])
    name4='.'.join(index.split(".")[0:4])
    leaf={"name":name4,"size":row.values[0]}
    for i in result:
        if i["name"]==name1:
            for j in i["children"]:
                if j["name"]==name2:
                    for k in j["children"]:
                        if k["name"]==name3:
                            k["children"].append(leaf)
                            break

        
#拼接成最后的結(jié)果
out={"name":"all","children":'a'}
out["children"]=result
#將里面的單引號改為雙引號
out=str(out)
#print type(out)
out=out.replace("'","\"")
#最后的text文件轉(zhuǎn)換為json即可。
with open('out.txt', 'w') as fout:
    fout.write(out)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 14,315評論 0 15
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子。 除根結(jié)點和葉子結(jié)點外,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,684評論 0 25
  • 感恩早起老公打的豆?jié){和做的營養(yǎng)早餐,吃完飯來到酒店接住表哥表嫂,幫他們實現(xiàn)第二個旅游目的地—古都開封。 感恩高速的...
    開荒者cx閱讀 161評論 0 1
  • 這艘船在這里
    多云轉(zhuǎn)魚閱讀 208評論 0 0

友情鏈接更多精彩內(nèi)容