You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:24:02