文章目录
- def __init__(self, root_dir, show_hidden=False, depth=0, max_depth=None, indent_symbol=’│ ‘, folder_symbol=’/ ‘, file_symbol=’- ‘): self.root_dir = root_dir self.show_hidden = show_hidden self.max_depth = max_depth self.indent_symbol = indent_symbol self.folder_symbol = folder_symbol self.file_symbol = file_symbol self.depth = depth 构造函数接收多个参数,允许用户自定义打印行为。特别是indent_symbol、folder_symbol和file_symbol参数,可以完全改变输出样式。
- def print_directory(self): try: items = os.listdir(self.root_dir) except FileNotFoundError: print(f”指定的目录 {self.root_dir} 不存在”) return except PermissionError: print(f”无法访问目录 {self.root_dir}”) return # 过滤隐藏文件 if not self.show_hidden: items = [item for item in items if not (item.startswith(‘.’) and os.path.isfile(os.path.join(self.root_dir, item)))] 方法首先尝试列出目录内容,并处理可能出现的异常。然后根据配置过滤隐藏文件。
- for index, item in enumerate(sorted(items), start=1): path = os.path.join(self.root_dir, item) is_dir = os.path.isdir(path) # 构建前缀 prefix = self.indent_symbol * self.depth if index == len(items): if is_dir: print(f”{prefix}└── {self.folder_symbol}{item}”) else: print(f”{prefix}└── {self.file_symbol}{item}”) else: if is_dir: print(f”{prefix}├── {self.folder_symbol}{item}”) else: print(f”{prefix}├── {self.file_symbol}{item}”) # 递归处理子目录 if is_dir: child_printer = DirectoryPrinter( root_dir=path, show_hidden=self.show_hidden, depth=self.depth + 1, max_depth=self.max_depth, indent_symbol=self.indent_symbol, folder_symbol=self.folder_symbol, file_symbol=self.file_symbol ) child_printer.print_directory() 这部分代码实现了递归打印的核心逻辑,使用不同的符号区分文件和文件夹,以及区分是否是最后一项。
目录
- 工具功能概述
- 核心代码解析
- 初始化配置
- 目录打印逻辑
- 递归打印
- 使用示例
- 输出效果
- 完整代码
在软件开发、系统管理和日常工作中,我们经常需要查看和分析目录结构。
这个DirectoryPrinter类提供了以下功能:
- 递归打印目录结构
- 可配置是否显示隐藏文件
- 可设置最大递归深度
- 自定义缩进和文件/文件夹符号
- 友好的交互式配置界面
def __init__(self, root_dir, show_hidden=False, depth=0, max_depth=None,
indent_symbol='│ ', folder_symbol='/ ', file_symbol='- '):
self.root_dir = root_dir
self.show_hidden = show_hidden
self.max_depth = max_depth
self.indent_symbol = indent_symbol
self.folder_symbol = folder_symbol
self.file_symbol = file_symbol
self.depth = depth
构造函数接收多个参数,允许用户自定义打印行为。特别是indent_symbol、folder_symbol和file_symbol参数,可以完全改变输出样式。
def print_directory(self):
try:
items = os.listdir(self.root_dir)
except FileNotFoundError:
print(f"指定的目录 {self.root_dir} 不存在")
return
except PermissionError:
print(f"无法访问目录 {self.root_dir}")
return
# 过滤隐藏文件
if not self.show_hidden:
items = [item for item in items if not (item.startswith('.') and os.path.isfile(os.path.join(self.root_dir, item)))]
方法首先尝试列出目录内容,并处理可能出现的异常。然后根据配置过滤隐藏文件。
for index, item in enumerate(sorted(items), start=1):
path = os.path.join(self.root_dir, item)
is_dir = os.path.isdir(path)
# 构建前缀
prefix = self.indent_symbol * self.depth
if index == len(items):
if is_dir:
print(f"{prefix}└── {self.folder_symbol}{item}")
else:
print(f"{prefix}└── {self.file_symbol}{item}")
else:
if is_dir:
print(f"{prefix}├── {self.folder_symbol}{item}")
else:
print(f"{prefix}├── {self.file_symbol}{item}")
# 递归处理子目录
if is_dir:
child_printer = DirectoryPrinter(
root_dir=path,
show_hidden=self.show_hidden,
depth=self.depth + 1,
max_depth=self.max_depth,
indent_symbol=self.indent_symbol,
folder_symbol=self.folder_symbol,
file_symbol=self.file_symbol
)
child_printer.print_directory()
这部分代码实现了递归打印的核心逻辑,使用不同的符号区分文件和文件夹,以及区分是否是最后一项。
通过交互式界面配置打印参数:
def main():
root_directory = input("请输入要打印的目录路径: ") or os.getcwd()
hide_hidden_files = input("是否隐藏隐藏文件? (y/n): ").lower() != 'y'
max_depth = input("请输入最大递归深度 (留空表示无限制): ").strip() or None
auto_print = input("是否自动打印目录结构? (y/n): ").lower() == 'y'
printer = DirectoryPrinter(
root_dir=root_directory,
show_hidden=hide_hidden_files,
max_depth=max_depth
)
printer.print_directory()
示例输出可能如下:
├── / dir1
│ ├── – file1.txt
│ └── / subdir
│ └── – file2.txt
└── / dir2
├── – file3.txt
└── – file4.txt
import os
class DirectoryPrinter:
def __init__(self, root_dir, show_hidden=False, depth=0, max_depth=None, indent_symbol='│ ', folder_symbol='/ ', file_symbol='- '):
"""
初始化目录打印器
:param root_dir: 指定要打印的目录路径
:param show_hidden: 是否打印隐藏文件和文件夹(默认为 False)
:param depth: 当前递归深度(内部使用,用户无需设置)
:param max_depth: 最大递归深度,None 表示无限制
:param indent_symbol: 缩进符号
:param folder_symbol: 文件夹前缀符号
:param file_symbol: 文件前缀符号
"""
self.root_dir = root_dir
self.show_hidden = show_hidden
self.max_depth = max_depth
self.indent_symbol = indent_symbol
self.folder_symbol = folder_symbol
self.file_symbol = file_symbol
self.depth = depth
def print_directory(self):
"""
打印目录结构
"""
try:
items = os.listdir(self.root_dir)
except FileNotFoundError:
print(f"指定的目录 {self.root_dir} 不存在")
return
except PermissionError:
print(f"无法访问目录 {self.root_dir}")
return
# 过滤隐藏文件
if not self.show_hidden:
items = [item for item in items if not (item.startswith('.') and os.path.isfile(os.path.join(self.root_dir, item)))]
# 递归打印目录和文件
for index, item in enumerate(sorted(items), start=1):
path = os.path.join(self.root_dir, item)
is_dir = os.path.isdir(path)
# 根据当前深度和最大深度决定是否继续递归
if self.max_depth is not None and self.depth > self.max_depth:
continue
# 构建前缀
prefix = self.indent_symbol * self.depth
if index == len(items):
if is_dir:
print(f"{prefix}└── {self.folder_symbol}{item}")
else:
print(f"{prefix}└── {self.file_symbol}{item}")
else:
if is_dir:
print(f"{prefix}├── {self.folder_symbol}{item}")
else:
print(f"{prefix}├── {self.file_symbol}{item}")
# 递归处理子目录
if is_dir:
child_printer = DirectoryPrinter(
root_dir=path,
show_hidden=self.show_hidden,
depth=self.depth + 1,
max_depth=self.max_depth,
indent_symbol=self.indent_symbol,
folder_symbol=self.folder_symbol,
file_symbol=self.file_symbol
)
child_printer.print_directory()
def main():
"""
主函数,用户配置入口
"""
# 配置参数
root_directory = input("请输入要打印的目录路径: ") or os.getcwd() # 默认为当前目录
hide_hidden_files = input("是否隐藏隐藏文件? (y/n): ").lower() != 'y'
max_depth = input("请输入最大递归深度 (留空表示无限制): ").strip() or None # 无限制
auto_print = input("是否自动打印目录结构? (y/n): ").lower() == 'y'
# 转换为整数
try:
max_depth = int(max_depth) if max_depth else None
except ValueError:
print("最大递归深度必须为整数")
return
# 打印配置
print("n=== 配置 ===")
print(f"根目录: {root_directory}")
print(f"隐藏文件和文件夹: {'是' if hide_hidden_files else '否'}")
print(f"最大递归深度: {'无限制' if max_depth is None else max_depth}")
# 初始化打印器
printer = DirectoryPrinter(
root_dir=root_directory,
show_hidden=hide_hidden_files,
max_depth=max_depth
)
# 开始打印
if auto_print:
print("n=== 目录结构 ===")
printer.print_directory()
else:
input("n按下回车键开始打印目录结构...")
print("n=== 目录结构 ===")
printer.print_directory()
# 程序主入口
if __name__ == "__main__":
main()
到此这篇关于基于Python实现优雅的目录结构打印工具的文章就介绍到这了,更多相关Python打印目录结构内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- 基于Python打造高效便捷的目录结构生成器
- python 项目目录结构设置
- python实现树形打印目录结构
- 在Python中移动目录结构的方法
- Python复制目录结构脚本代码分享
- python递归打印某个目录的内容(实例讲解)