如何用Python筛选指定二级子目录并复制目标a.txt文件?
解决Python目录筛选与文件复制问题
首先看你的需求:要从root目录中筛选出一级子目录下二级子目录名称数值≤60的项,然后把这些二级目录里的a.txt复制到root_filter并保留对应目录结构。你的现有代码只做了目录遍历打印,还没实现核心的筛选和复制逻辑,我来帮你调整。
需求拆解
要实现这个功能,我们需要精准控制遍历层级,而非用os.walk遍历所有层级(针对性遍历会更高效):
- 遍历
root下的所有一级子目录(A、B、C) - 对每个一级子目录,遍历其下的二级子目录
- 判断二级子目录名称的数值是否≤60(需将字符串转为整数)
- 对符合条件的目录,创建对应的目标目录结构,然后复制
a.txt
完整实现代码
import os import shutil # 源根目录和目标根目录 dataroot = './root' target_root = './root_filter' # 遍历一级子目录(A、B、C) for first_level_dir in os.listdir(dataroot): first_level_path = os.path.join(dataroot, first_level_dir) # 确保是目录才继续 if not os.path.isdir(first_level_path): continue # 遍历当前一级目录下的二级子目录 for second_level_dir in os.listdir(first_level_path): second_level_path = os.path.join(first_level_path, second_level_dir) if not os.path.isdir(second_level_path): continue # 尝试把二级目录名转成整数,判断是否≤60 try: dir_num = int(second_level_dir) if dir_num > 60: continue except ValueError: # 如果目录名不是数字,直接跳过 continue # 构造源文件路径和目标文件路径 source_file = os.path.join(second_level_path, 'a.txt') # 检查源文件是否存在,避免复制不存在的文件报错 if not os.path.exists(source_file): print(f"警告:{source_file} 不存在,跳过") continue target_dir = os.path.join(target_root, first_level_dir, second_level_dir) # 创建目标目录(如果不存在的话,exist_ok=True避免重复创建报错) os.makedirs(target_dir, exist_ok=True) target_file = os.path.join(target_dir, 'a.txt') # 复制文件(copy2会保留文件元数据,如修改时间) shutil.copy2(source_file, target_file) print(f"已复制 {source_file} 到 {target_file}")
代码细节说明
- 层级控制:分两次遍历一级、二级目录,比
os.walk更精准,避免处理无关层级 - 异常处理:用
try-except捕获目录名转整数的异常,防止非数字目录导致程序崩溃 - 健壮性检查:每次都验证是否为目录、源文件是否存在,减少运行报错概率
- 目录创建:
os.makedirs的exist_ok=True参数可自动创建多级目标目录,无需手动逐层创建 - 文件复制:使用
shutil.copy2而非基础的shutil.copy,会保留文件的元数据(如创建/修改时间),更贴合实际使用需求
运行这段代码后,就能得到你期望的root_filter目录结构了。
内容的提问来源于stack exchange,提问作者KimHee
相关产品推荐
相关产品推荐

