提示词:
我决定写一个python小脚本,给它一个文件路径,能够输出文件下的目录树。
目录树格式大致如下:(此处省略)
用到递归逻辑:遍历当前目录,打印文件,如果是文件夹则深入进去。
.strip(): 自动帮你删掉输入路径时可能不小心带上的首尾空格
提示词:key = lambda是什么意思,怎么用的?
lambda是一种快速定义单行函数的方式。
lambda x:x.name等价于
def get_name(x):
return x.name
key参数
在python的内置函数中,key用来决定排序的依据,在这段代码里就是"文件夹优先级高于文件名"、"文件名字符串升序排列"。
python
import pathlib
def draw_tree(path, indent=""):
"""
递归生成目录树结构
"""
path = pathlib.Path(path)
# 过滤掉一些不想显示的目录(如 __pycache__, .git 等)
ignored = {'.git', '__pycache__', '.venv', '.vscode'}
# 获取当前路径下的所有文件和文件夹,并排序(文件夹在前,文件在后)
try:
# 获取并排序:文件夹在前,文件在后
items = sorted(list(path.iterdir()), key=lambda x: (x.is_file(), x.name))
items = [item for item in items if item.name not in ignored]
except PermissionError:
print(f"{indent} [! 权限不足,无法访问]")
return
for i, item in enumerate(items):
# 判断是否为当前层级的最后一个元素,决定使用 └── 还是 ├──
is_last = (i == len(items) - 1)
connector = "└── " if is_last else "├── "
# 打印当前项
print(f"{indent}{connector}{item.name}{'/' if item.is_dir() else ''}")
# 如果是目录,递归调用
if item.is_dir():
# 如果是最后一个元素,下级缩进不再需要垂直线
new_indent = indent + (" " if is_last else "│ ")
draw_tree(item, new_indent)
if __name__ == "__main__":
# --- 用户交互部分 ---
user_input = input("请输入目标文件夹路径 (直接回车表示当前目录): ").strip()
# 如果用户没输入,默认当前目录 '.'
target_path = user_input if user_input else "."
path_obj = pathlib.Path(target_path)
# 路径检查
if path_obj.exists() and path_obj.is_dir():
print(f"\n{path_obj.absolute().name}/")
draw_tree(path_obj)
else:
print(f"错误: 路径 '{target_path}' 不存在或不是一个文件夹。")