输出一个文件夹的所有目录和文件结构
新建一个Python文件,输入
这个文件表示查询一个文件夹所有的目录结构
import osdef print_directory_structure(root_dir):"""打印树状目录结构(优化版)"""if not os.path.exists(root_dir):print(f"错误:路径 {root_dir} 不存在")returnif not os.path.isdir(root_dir):print(f"错误:{root_dir} 不是一个目录")returnroot_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 osdef 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)returnif not os.path.isdir(root_dir):msg = f"错误:{root_dir} 不是一个目录"print(msg)if output_file: print(msg, file=output_file)returnroot_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 + filesfor 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 redef 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}")returnroot_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},跳过")continueprefix_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和它的所有子文件