输出一个文件夹的所有目录和文件结构
新建一个Python文件,输入
这个文件表示查询一个文件夹所有的目录结构
import os
def print_directory_structure(root_dir):
"""打印树状目录结构(优化版)"""
if not os.path.exists(root_dir):
print(f"错误:路径 {root_dir} 不存在")
return
if not os.path.isdir(root_dir):
print(f"错误:{root_dir} 不是一个目录")
return
root_name = os.path.basename(os.path.normpath(root_dir))
print(f"{root_name}/") # 根目录标题
# 递归辅助函数(处理层级缩进和符号)
def traverse_dir(current_dir, prefix, is_last):
"""
current_dir: 当前遍历的目录路径
prefix: 层级前缀(用于绘制竖线/空格)
is_last: 是否是父目录的最后一个子项
"""
# 获取当前目录下的子目录和文件(先目录后文件)
entries = sorted(os.listdir(current_dir), key=lambda x: (not os.path.isdir(os.path.join(current_dir, x)), x))
dirs = [e for e in entries if os.path.isdir(os.path.join(current_dir, e))]
files = [e for e in entries if not os.path.isdir(os.path.join(current_dir, e))]
all_entries = dirs + files # 先目录后文件的顺序
# 遍历所有子项
for i, entry in enumerate(all_entries):
is_last_entry = (i == len(all_entries) - 1)
entry_path = os.path.join(current_dir, entry)
# 连接符号:最后一个项用└──,其他用├──
connector = '└── ' if is_last_entry else '├── '
# 显示行(目录加/,文件不加)
line = f"{connector}{entry}/" if os.path.isdir(entry_path) else f"{connector}{entry}"
print(f"{prefix}{line}")
# 下一层级的前缀:如果当前是最后一个项,用空格;否则用竖线
if not is_last_entry:
next_prefix = prefix + "│ "
else:
next_prefix = prefix + " "
# 递归处理子目录(仅目录需要继续遍历)
if os.path.isdir(entry_path):
traverse_dir(entry_path, next_prefix, is_last_entry)
# 从根目录的子项开始递归(根目录本身已打印,前缀为空)
traverse_dir(root_dir, "", is_last=True)
if __name__ == "__main__":
# 移除输入路径两端的单引号和双引号
target_dir = input("请输入文件夹路径: ").strip().strip('"\'')
print_directory_structure(target_dir)
运行文件
输入文件夹路径例如"C:\Users\86195\Desktop\java_demo\untitled1",输入的路径带不带双引号都行
带双引号
不带双引号
进阶操作
可以把一个文件夹a的目录结构信息存到txt文件中,然后根据txt文件在任意文件夹b生成文件夹a以及它的子文件
新建Python文件1.py
这个文件表示查询文件夹的所有目录结构,把目录结构信息输出到控制台和写入txt文件,如果txt文件有内容就覆盖
import os
def print_directory_structure(root_dir, output_file=None):
"""打印树状目录结构(支持输出到文件)"""
if not os.path.exists(root_dir):
msg = f"错误:路径 {root_dir} 不存在"
print(msg)
if output_file: print(msg, file=output_file)
return
if not os.path.isdir(root_dir):
msg = f"错误:{root_dir} 不是一个目录"
print(msg)
if output_file: print(msg, file=output_file)
return
root_name = os.path.basename(os.path.normpath(root_dir))
display_line = f"{root_name}/"
print(display_line)
if output_file: print(display_line, file=output_file) # 输出到文件
def traverse_dir(current_dir, prefix, is_last, output_file):
entries = sorted(os.listdir(current_dir), key=lambda x: (not os.path.isdir(os.path.join(current_dir, x)), x))
dirs = [e for e in entries if os.path.isdir(os.path.join(current_dir, e))]
files = [e for e in entries if not os.path.isdir(os.path.join(current_dir, e))]
all_entries = dirs + files
for i, entry in enumerate(all_entries):
is_last_entry = (i == len(all_entries) - 1)
entry_path = os.path.join(current_dir, entry)
connector = '└── ' if is_last_entry else '├── '
line = f"{connector}{entry}/" if os.path.isdir(entry_path) else f"{connector}{entry}"
display_line = f"{prefix}{line}"
print(display_line) # 输出到控制台
if output_file: print(display_line, file=output_file) # 输出到文件
next_prefix = prefix + ("│ " if not is_last_entry else " ")
if os.path.isdir(entry_path):
traverse_dir(entry_path, next_prefix, is_last_entry, output_file)
traverse_dir(root_dir, "", is_last=True, output_file=output_file)
if __name__ == "__main__":
target_dir = input("请输入文件夹路径(带不带双引号均可): ").strip().strip('"')
txt_path = input("请输入txt文件保存路径(带不带双引号均可): ").strip().strip('"')
# 打开文件并覆盖写入(若文件不存在则创建)
with open(txt_path, 'w', encoding='utf-8') as f:
print_directory_structure(target_dir, f)
print(f"目录结构已成功保存到 {txt_path}(文件已覆盖)")
新建Python文件2.py
这个文件表示根据txt文件的信息在一个文件夹新建目录结构
import os
import re
def rebuild_from_txt(txt_path, target_parent_dir):
"""根据txt文件重建目录结构"""
# 读取并清洗txt内容
with open(txt_path, 'r', encoding='utf-8') as f:
lines = [line.rstrip('\n') for line in f if line.strip()] # 跳过空行
if not lines:
print("错误:txt文件内容为空")
return
# 解析根目录(第一行必须是"根目录名/")
root_line = lines[0]
if not root_line.endswith('/'):
print(f"错误:txt文件格式错误,第一行应为根目录(以/结尾),当前第一行:{root_line}")
return
root_dir_name = root_line[:-1] # 去除末尾的/
target_root_dir = os.path.join(target_parent_dir, root_dir_name)
# 创建根目录(若已存在则跳过)
try:
os.makedirs(target_root_dir, exist_ok=True)
print(f"创建根目录:{target_root_dir}")
except Exception as e:
print(f"根目录创建失败:{e}")
return
# 维护当前层级的目录栈(保存各层目录名)
dir_stack = [root_dir_name] # 初始为根目录名
# 正则匹配行结构(处理缩进和符号)
line_pattern = re.compile(r'^(\s*)(├── |└── )(.*?)(/?)$')
for line in lines[1:]: # 第一行已处理,从第二行开始
match = line_pattern.match(line)
if not match:
print(f"警告:无法解析行(格式错误):{line},跳过")
continue
prefix_space, _, name, is_dir_flag = match.groups()
is_dir = is_dir_flag == '/' # 目录以/结尾
# 计算当前层级(每个层级占4个字符:如"│ "或" ")
current_depth = len(prefix_space) // 4 + 1 # 根目录是层级0,子目录层级从1开始
# 调整目录栈长度(确保栈长度等于当前层级)
while len(dir_stack) > current_depth:
dir_stack.pop() # 层级变浅,弹出深层目录
if len(dir_stack) < current_depth:
print(f"警告:行结构不完整(层级跳跃):{line},跳过")
continue
# 拼接当前路径
current_parent = os.path.join(target_parent_dir, *dir_stack)
current_path = os.path.join(current_parent, name)
# 创建目录或文件
try:
if is_dir:
os.makedirs(current_path, exist_ok=True)
dir_stack.append(name) # 目录入栈,用于下一层级
print(f"创建目录:{current_path}")
else:
# 创建空文件(确保父目录存在)
os.makedirs(current_parent, exist_ok=True)
with open(current_path, 'w', encoding='utf-8'):
pass # 空文件
print(f"创建文件:{current_path}")
except Exception as e:
print(f"创建失败:{current_path},错误:{e}")
if __name__ == "__main__":
txt_path = input("请输入txt文件路径(带不带双引号均可): ").strip().strip('"')
target_parent = input("请输入目标父文件夹路径(带不带双引号均可): ").strip().strip('"')
rebuild_from_txt(txt_path, target_parent)
print("目录结构重建完成!")
新建txt文件
运行1.py文件
文件夹路径例如我输入
C:\Users\86195\Desktop\1新建文件夹\1
表示把文件夹1的目录信息在控制台输出并且在txt文件中写入,目录信息包括文件夹1
所有输入的文件路径带不带双引号都可以
运行2.py文件
例如目标父文件夹路径我输入
C:\Users\86195\Desktop\java_demo
会根据txt中的文件信息在java_demo文件夹下新建一个文件夹1和它的所有子文件