首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python3 分析 tree命令输出信息,并保存到excel中

python3 分析 tree命令输出信息,并保存到excel中

原创
作者头像
tankaro
修改2025-06-10 16:32:49
修改2025-06-10 16:32:49
960
举报

sudo apt install python3-pip

pip install pandas openpyxl

原来的代码有问题,代码实现更新一下。

运行命令

代码语言:txt
复制
python3 a_tree_dir_file_excel.py ./nvlink 3  nvlink_tree.xlsx
python3 a_tree_dir_file_excel.py ./zz_nvlink 3  zz_nvlink_tree.xlsx

源代码如下:

代码语言:python3
复制
# Python3默认使用Unicode编码,可以直接处理中文字符
# 但如果你需要确保编码,可以在文件开头添加编码声明
# -*- coding: utf-8 -*-

import pandas as pd
import os
import sys

def main():
    # 参数个数 (包括脚本名本身)
    arg_count = len(sys.argv)

    # 参数内容列表
    args = sys.argv

    print(f"参数个数: {arg_count}")
    print(f"参数列表: {args}")
    if 4 != arg_count:
        print(f"错误: {e}", file=sys.stderr)
        sys.exit(1)

    print(f"args[0]={args[0]} args[1]={args[1]} args[2]={args[2]}")

    cmdTree1 = "tree --noreport -n -L "
    cmdTree = cmdTree1 + args[2] + " " + args[1]
    outputfile = args[3]
    print(f"outputfile={outputfile}")
    # 生成 tree 文本并解析
    #tree_text = os.popen('tree --noreport -n -L 4 /home/gaozenghua/ACClink_Device/kernel/nvlink').read()
    tree_text = os.popen(cmdTree).read()
    #lines = [line.strip() for line in tree_text.split('\n') if line.strip()]
    lines = []
    for line in tree_text.split('\n'):
        stripped_line = line.strip()
        if stripped_line:  # 检查是否非空
            lines.append(line)
    # 转换为 DataFrame
    data = []
    shitname = ["序号1", "根文件", "第二级目录文件", "第三级目录文件", 
                "第四级目录文件", "第五级目录文件", "第六级目录文件", 
                "第七级目录文件", "第八级目录文件", "第九级目录文件", "第十级目录文件"]

    baseStr = ["├── ", "└── ", "│   ├── ", "│   └── ", "│   │   ├── ", "│   │   └── ", "│   │   │   ├── ", "│   │   │   └── "]
    firstDir =["├── ", "└── ", "│"]
    len1 = [len(s) for s in baseStr]
    #print(len1)
    indexDirFile = 0
    count = 0
    countMax = 0
    for line in lines:
        count = line.count('│')
        if count > countMax:
            countMax = count
    #print(f"countMax={countMax} count={count}")
    def contains_any_substring(main_string, substrings_list):
        """检查字符串是否包含列表中的任意子字符串"""
        if any(substring in main_string for substring in substrings_list):
            return 0  # 包含
        else:
            return -1  # 不包含
    def append_str_list():
        tmp = (countMax + 1) * 2
        for i in range(tmp):
            listArray.append(baseStr[i])
        return tmp

    # 初始化一个空列表
    listArray = []

    listCount = append_str_list()
    #print(f"countMax={countMax} listCount={listCount}")

    '''
    for str in listArray:
        print(f"listArray str={str}")
    '''
    runCnt = 0
    nameNULL = ""
    s = "Hello, 世界"  # 包含英文和中文
    length = len(s)    # 计算字符数(不是字节数)
    #print(length)      # 输出:8(H,e,l,l,o,, ,世,界)
    flagString1 = "│   "
    flagString2 = "├── "
    flagString3 = "└── "
    flagString4 = "    "

    flagStrSize = 4
    flagStrSize = len(flagString1)
    #print(f" flagString1={flagString1} flagStrSize={flagStrSize}=len(flagString1)")
    flagStrSize = len(flagString2)
    ##print(f" flagString2={flagString2} flagStrSize={flagStrSize}=len(flagString2)")
    flagStrSize = len(flagString3)
    #print(f" flagString3={flagString3} flagStrSize={flagStrSize}=len(flagString3)")
    ##print("\n\n")

    for line in lines:
        usefullBufIndex = 0
        if line.startswith((flagString1, flagString2, flagString3, flagString4)):
            #print(f"-1- listCount={listCount} line={line}")
            indexDirFile = indexDirFile + 1

            flagStrSize = line.find(flagString2)
            if -1 == flagStrSize:
                flagStrSize = line.find(flagString3)
            else:
                usefullBufIndex = len(flagString2)
            if -1 == flagStrSize:
                print(f"************Unusefull listCount={listCount} line=({line})")
            else:
                usefullBufIndex = len(flagString3)
                usefullBufIndex = usefullBufIndex + flagStrSize
                lineIndex = line[usefullBufIndex:]
                if (usefullBufIndex / len(flagString2)) > (usefullBufIndex / len(flagString3)):
                    bufferIndex = (int)(usefullBufIndex / len(flagString2))
                else:
                    bufferIndex = (int)(usefullBufIndex / len(flagString3))
                #print(f"usefull indexDirFile={indexDirFile} line=\"{line}\" lineIndex=\"{lineIndex}\" bufferIndex={bufferIndex} flagStrSize={flagStrSize} usefullBufIndex={usefullBufIndex}")
                if 1 == bufferIndex:
                    data.append({shitname[0]: indexDirFile, shitname[1]: lineIndex})
                elif 2 == bufferIndex:
                    data.append({shitname[0]: indexDirFile, shitname[1]: nameNULL, shitname[2]: lineIndex})
                elif 3 == bufferIndex:
                    data.append({shitname[0]: indexDirFile, shitname[1]: nameNULL, shitname[2]: nameNULL, shitname[3]: lineIndex})
                elif 4 == bufferIndex:
                    data.append({shitname[0]: indexDirFile, shitname[1]: nameNULL, shitname[2]: nameNULL, shitname[3]: nameNULL, shitname[4]: lineIndex})
        else:
            print(f"Unusefull listCount={listCount} line={line}")

    df = pd.DataFrame(data)

    # 保存为 Excel
    df.to_excel(outputfile, index=False, engine='openpyxl')

if __name__ == "__main__":
    main()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档