如何用Python从多个目录复制指定文件并按索引重命名
问题原因&修复方案
1. 错误根源
- 你使用
'X.bmp'%(i,)做字符串格式化,但字符串中没有预留%d占位符,导致传入的参数i没法被插入,触发TypeError - 除此之外你的代码还有多处逻辑错误:
- 缩进错误:遍历subfolder2的代码缩进层级不对,只会处理最后一个二级子目录
- 序号逻辑错误:
for i in filename是遍历文件名的单个字符,不是计数逻辑 - 大小写不匹配:代码判断文件名是
X.bmp,实际文件是小写的x.bmp,会匹配失败 - 没有预先创建目标目录,路径不存在时会报错
2. 修复后可运行代码
import os import shutil root_dir = 'oldDir' dest_dir = 'NewDir' # 先创建目标目录,不存在就新建,存在也不报错 os.makedirs(dest_dir, exist_ok=True) # 初始化序号计数器 count = 1 # 遍历根目录下的所有文件夹(Dir1/Dir2/Dir3...) for folder in os.listdir(root_dir): folder_path = os.path.join(root_dir, folder) if not os.path.isdir(folder_path): continue # 遍历一级子目录subDir1 for subfolder in os.listdir(folder_path): subfolder_path = os.path.join(folder_path, subfolder) if not os.path.isdir(subfolder_path): continue # 遍历二级子目录subDir2 for subfolder2 in os.listdir(subfolder_path): subfolder2_path = os.path.join(subfolder_path, subfolder2) if not os.path.isdir(subfolder2_path): continue # 遍历当前subDir2下的所有文件 for filename in os.listdir(subfolder2_path): # 匹配x.bmp,忽略大小写避免匹配失败 if filename.lower() == 'x.bmp': file_path = os.path.join(subfolder2_path, filename) # 生成新的文件名,序号自增 new_filename = f'x{count}.bmp' dest_path = os.path.join(dest_dir, new_filename) shutil.copy(file_path, dest_path) print(f"Copied {file_path} to {dest_path}") count += 1
3. 简化版本(固定目录层级可用)
如果你的目录层级固定为根目录/[序号目录]/subDir1/subDir2/的结构,可以用glob模块简化代码,无需写多层循环:
import os import shutil import glob root_dir = 'oldDir' dest_dir = 'NewDir' os.makedirs(dest_dir, exist_ok=True) # 直接匹配所有符合路径规则的x.bmp文件 x_bmp_files = glob.glob(os.path.join(root_dir, '*', 'subDir1', 'subDir2', 'x.bmp')) for idx, file_path in enumerate(x_bmp_files, start=1): new_filename = f'x{idx}.bmp' dest_path = os.path.join(dest_dir, new_filename) shutil.copy(file_path, dest_path) print(f"Copied {file_path} to {dest_path}")
内容的提问来源于stack exchange,提问作者Fatema Sultana
相关产品推荐
相关产品推荐

