导出指定文件夹下的文件结构 工具模块-Python
python模块代码
import os
import json
import xml.etree.ElementTree as ET
from typing import List, Optional, Dict, Union
from pathlib import Path class DirectoryTreeExporter:def __init__(self,root_path: str,output_file: str,fmt: str = 'txt',show_root: bool = True,include_hidden_files: bool = False,include_hidden_dirs: bool = False,folders_only: bool = False,allowed_extensions: Optional[List[str]] = None):"""参数说明:- root_path: 要扫描的根目录路径 - output_file: 输出文件路径 - fmt: 输出格式(txt/json/xml)- show_root: 是否显示根目录为树的顶层节点 - include_hidden_files: 是否包含隐藏文件 - include_hidden_dirs: 是否包含隐藏文件夹 - folders_only: 是否仅显示文件夹 - allowed_extensions: 允许的文件扩展名列表(例如 ['.py', '.txt'])"""self.root = Path(root_path).resolve()self.output_file = output_file self.fmt = fmt.lower() self.show_root = show_root self.include_hidden_files = include_hidden_files self.include_hidden_dirs = include_hidden_dirs self.folders_only = folders_only self.allowed_extensions = set(allowed_extensions or [])def _is_hidden(self, path: Path) -> bool:"""跨平台的隐藏文件/目录检测"""if os.name == 'nt': # Windows系统 hidden_attr = os.stat(path).st_file_attributes return hidden_attr & 2 # FILE_ATTRIBUTE_HIDDEN else: # Unix-like系统 return path.name.startswith('.') def _should_include(self, path: Path, is_dir: bool) -> bool:"""过滤条件判断"""# 隐藏文件处理 if is_dir:if not self.include_hidden_dirs and self._is_hidden(path):return False else:if not self.include_hidden_files and self._is_hidden(path):return False # 仅目录模式 if self.folders_only and not is_dir:return False # 扩展名过滤 if not is_dir and self.allowed_extensions: return path.suffix.lower() in self.allowed_extensions return True def _build_tree(self, node: Path, tree_dict: Dict) -> None:"""递归构建树形结构"""for child in node.iterdir(): if not self._should_include(child, child.is_dir()): continue entry = {'name': child.name, 'type': 'directory' if child.is_dir() else 'file','children': []}if child.is_dir(): self._build_tree(child, entry)tree_dict['children'].append(entry)def generate(self) -> None:"""生成并导出目录树"""# 构建数据结构 tree = {'name': self.root.name, 'type': 'directory','children': []} if self.show_root else {'children': []}if self.show_root: self._build_tree(self.root, tree)else:for child in self.root.iterdir(): if self._should_include(child, child.is_dir()): entry = {'name': child.name, 'type': 'directory' if child.is_dir() else 'file','children': []}if child.is_dir(): self._build_tree(child, entry)tree['children'].append(entry)# 选择输出格式 output_methods = {'txt': self._generate_txt,'json': self._generate_json,'xml': self._generate_xml }if self.fmt not in output_methods:raise ValueError(f"不支持的格式: {self.fmt}") output_methods[self.fmt](tree)def _generate_txt(self, tree: Dict) -> None:"""生成文本树形结构"""def _recurse(node: Dict, depth: int, lines: List[str], is_last: bool) -> None:prefix = ""if depth > 0:prefix = "│ " * (depth - 1) + ("└── " if is_last else "├── ")lines.append(f"{prefix}{node['name']} ({node['type']})")children = node.get('children', [])for i, child in enumerate(children):_recurse(child, depth + 1, lines, i == len(children)-1)lines = []if self.show_root: _recurse(tree, 0, lines, True)else:for child in tree['children']:_recurse(child, 0, lines, False)lines = self.replace_vertical_below_lconnector(lines)with open(self.output_file, 'w', encoding='utf-8') as f:f.write("\n".join(lines)) def _generate_json(self, tree: Dict) -> None:"""生成JSON结构"""with open(self.output_file, 'w', encoding='utf-8') as f:json.dump(tree, f, indent=2, ensure_ascii=False)def _generate_xml(self, tree: Dict) -> None:"""生成XML结构"""def _add_node(parent: ET.Element, node: Dict) -> None:elem = ET.SubElement(parent, node['type'])elem.set('name', node['name'])for child in node.get('children', []):_add_node(elem, child)root = ET.Element('directory_tree')if self.show_root: _add_node(root, tree)else:for child in tree['children']:_add_node(root, child)tree = ET.ElementTree(root)tree.write(self.output_file, encoding='utf-8', xml_declaration=True)# 使用示例
if __name__ == "__main__":exporter = DirectoryTreeExporter(root_path=r"D:\Creation\JiLeiFunc\root_dir",output_file=r"D:\Creation\JiLeiFunc\tree.txt", fmt="txt",show_root=True,include_hidden_files=False,folders_only=False # ,# allowed_extensions=['.py', '.txt'])exporter.generate()
相关文章:
导出指定文件夹下的文件结构 工具模块-Python
python模块代码 import os import json import xml.etree.ElementTree as ET from typing import List, Optional, Dict, Union from pathlib import Path class DirectoryTreeExporter:def __init__(self,root_path: str,output_file: str,fmt: str txt,show_root: boo…...
Leetcode - 周赛436
目录 一、3446. 按对角线进行矩阵排序二、3447. 将元素分配给有约束条件的组三、3448. 统计可以被最后一个数位整除的子字符串数目四、3449. 最大化游戏分数的最小值 一、3446. 按对角线进行矩阵排序 题目链接 本题可以暴力枚举,在确定了每一个对角线的第一个元素…...
【pytest】编写自动化测试用例命名规范README
API_autoTest 项目介绍 1. pytest命名规范 测试文件: 文件名需要以 test_ 开头或者以 _test.py 结尾。例如,test_login.py、user_management_test.py 这样的命名方式,pytest 能够自动识别并将其作为测试文件来执行其中的测试用例。 测试类…...
Compose常用UI组件
Compose常用UI组件 概述Modifier 修饰符常用Modifier修饰符作用域限定Modifier Modifier 实现原理Modifier.Element链的构建链的解析 常用基础组件常用布局组件列表组件 概述 Compose 预置了很多基础组件,如 Button,TextField,TopAppBar等&a…...
斐波那契数列模型:在动态规划的丝绸之路上追寻斐波那契的足迹(上)
文章目录 引言递归与动态规划的对比递归解法的初探动态规划的优雅与高效自顶向下的记忆化搜索自底向上的迭代法 性能分析与比较小结 引言 斐波那契数列,这一数列如同一条无形的丝线,穿越千年时光,悄然延续其魅力。其定义简单而优美ÿ…...
Hackthebox- Season7- Titanic 简记 [Easy]
简记 ip重定向到 http://titanic.htb,先添加hosts 收集子域名 wfuzz -c -u http://titanic.htb/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H Host:FUZZ.titanic.htb --hl 9 ******************************************************** * Wfu…...
Sa-Token 根据官方文档简单实现登录认证的示例
Sa-Token 根据官方文档实现登录鉴权测试 功能实现步骤依赖配置文件启动类创建 controller启动项目测试不用密码登录查看cookie状态 密码登录查看cookie状态 修改token名称 Apipost 测试无 cookie 模式【使用 token】后端将 token 返回到前端修改代码:测试࿱…...
rustdesk编译修改名字
最近,我用Rust重写了一个2W行C代码的linux内核模块。在此记录一点经验。我此前没写过内核模块,认识比较疏浅,有错误欢迎指正。 为什么要重写? 这个模块2W行代码量看起来不多,却在线上时常故障,永远改不完。…...
BS5852英国家具防火安全条款主要包括哪几个方面呢?
什么是BS5852检测? BS5852是英国针对家用家具的强制性安全要求,主要测试家具在受到燃烧香烟和火柴等火源时的可燃性。这个标准通常分为四个部分进行测试,但实际应用中主要测试第一部分和第二部分,包括烟头测试和利用乙炔火焰模拟…...
【运维】源码编译安装cmake
背景: 已经在本地源码编译安装gcc/g,现在源码安装cmake 下载源码 下载地址:CMake - Upgrade Your Software Build System 安装步骤: ./bootstrap --prefix/usr/local/cmake make make install 错误处理 1、提示找不到libmpc.…...
检测网络安全漏洞 工具
实验一的名称为信息收集和漏洞扫描 实验环境:VMware下的kali linux2021和Windows7 32,网络设置均为NAT,这样子两台机器就在一个网络下。攻击的机器为kali,被攻击的机器为Windows 7。 理论知识记录: 1.信息收集的步骤 2.ping命令…...
frameworks 之 Activity添加View
frameworks 之 Activity添加View 1 LaunchActivityItem1.1 Activity 创建1.2 PhoneWindow 创建1.3 DecorView 创建 2 ResumeActivityItem 讲解 Activity加载View的时机和流程 涉及到的类如下 frameworks/base/core/java/android/app/Activity.javaframeworks/base/services/cor…...
UWB技术中的两种调制方式:PPM与PAM
Ultra-Wideband (UWB) 技术以其低功耗、宽频谱和高精度定位的特点,广泛应用于物联网(IoT)、智能家居、资产追踪和无线通信等领域。在UWB中,信号的调制方式对于数据传输的效率和精度起着至关重要的作用。本文将深入探讨UWB中常用的…...
达梦:用户和模式
目录标题 数据库管理系统与用户权限管理**四权分立****用户管理与权限划分****用户管理界面与权限控制****用户创建与管理****实操**1. **默认创建用户与模式**:2. **用户权限和角色分配**:3. **命令行管理用户与角色**:4. 模式也可以创建 **…...
23. AI-大语言模型-DeepSeek
文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本3. 特征4. 地址链接5. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文本分类3. 知识推理 4. 编程…...
Spring-GPT智谱清言AI项目(附源码)
一、项目介绍 本项目是Spring AI第三方调用整合智谱请言(官网是:https://open.bigmodel.cn)的案例,回答响应流式输出显示,这里使用的是免费模型,需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…...
计算机网络(涵盖OSI,TCP/IP,交换机,路由器,局域网)
一、网络通信基础 (一)网络通信的概念 网络通信是指终端设备之间通过计算机网络进行的信息传递与交流。它类似于现实生活中的物品传递过程:数据(物品)被封装成报文(包裹),通过网络…...
云计算架构学习之Ansible-playbook实战、Ansible-流程控制、Ansible-字典循环-roles角色
一、Ansible-playbook实战 1.Ansible-playbook安装软件 bash #编写yml [rootansible ansible]# cat wget.yml - hosts: backup tasks: - name: Install wget yum: name: wget state: present #检查playbook的语法 [rootansible ansible]…...
《运维工程师如何利用DeepSeek实现智能运维:分级实战指南》
目录 智能运维革命:DeepSeek带来的范式转变DeepSeek核心运维能力全景解析分级实战场景与解决方案 3.1 初级工程师:自动化运维入门3.2 中级工程师:复杂系统诊断与优化3.3 高级工程师:架构级智能运维典型项目案例深度剖析 4.1 金融系统全链路监控体系构建4.2 电商大促资源弹性…...
windows事件倒计时器与提醒组件
widgets 这是桌面组件前端开源组件,作者称:项目还在持续完善中,目前包含键盘演示、抖音热榜、喝水提醒、生日列表、待办事项、倒计时、灵动通知、打工进度等多个组件 有vue编程能力的可以自己做组件 百度网盘 夸克网盘 桌面组件 | Ca…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...
