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

基于CSV列批量重命名子目录文件并移动至可变路径求助

批量重命名并移动子目录文件(基于CSV配置)

需求说明

现有数百个文件分散在不同子目录中,需完成以下操作:

  1. 先在原位置重命名:避免移动时同名文件互相覆盖
  2. 按CSV指定规则移动:新路径依赖CSV中的Client和RequestID字段,新文件名由Client、Type、Date字段生成

当前文件结构

A/new_reqest_11_02_01.pdf
B/new_reqest_11_02_01.pdf
B/new_reqest_11_03_01.pdf

期望文件结构

A/123456/A_F_11_02_01.pdf
B/123964/B_R_11_02_01.pdf
B/158964/B_G_11_02_01.pdf

CSV配置示例

ClientRequestIDOldFileNameTypeDate
A123456new_reqest_11_02_01.pdfF11_02_01
B123964new_reqest_11_03_01.pdfR11_02_01

问题痛点

  • 直接移动时会出现同名文件覆盖问题
  • 已能通过代码创建目标目录树,但无法关联CSV字段生成新文件名和路径

解决方案代码

以下代码解决了文件匹配、重命名防覆盖、路径生成的核心问题:

import os
import csv
import shutil

# CSV文件路径,请根据实际修改
CSV_PATH = r'C:\Users\me\Desktop\Testing\Rename_Refile.csv'
# 根目录(所有A/B子目录的上级目录)
ROOT_DIR = r'C:\Users\me\Desktop\Testing'

def process_files():
    with open(CSV_PATH, newline='', encoding='utf-8') as csvfile:
        # 用字典读取CSV,通过字段名取值更易维护
        reader = csv.DictReader(csvfile)
        for row in reader:
            # 1. 构造原文件完整路径
            old_file_path = os.path.join(ROOT_DIR, row['Client'], row['OldFileName'])
            
            # 跳过不存在的文件,避免程序中断
            if not os.path.exists(old_file_path):
                print(f"警告:文件不存在,跳过处理:{old_file_path}")
                continue
            
            # 2. 生成新文件名和目标路径
            new_filename = f"{row['Client']}_{row['Type']}_{row['Date']}.pdf"
            target_dir = os.path.join(ROOT_DIR, row['Client'], row['RequestID'])
            target_file_path = os.path.join(target_dir, new_filename)
            
            # 3. 防覆盖逻辑:若目标文件已存在,自动添加编号
            counter = 1
            while os.path.exists(target_file_path):
                name, ext = os.path.splitext(new_filename)
                new_filename_with_counter = f"{name}_{counter}{ext}"
                target_file_path = os.path.join(target_dir, new_filename_with_counter)
                counter += 1
            
            # 4. 创建目标目录(exist_ok=True避免重复判断)
            os.makedirs(target_dir, exist_ok=True)
            
            # 5. 移动并重命名文件(shutil.move可同时完成两项操作)
            shutil.move(old_file_path, target_file_path)
            print(f"已处理:{old_file_path} -> {target_file_path}")

if __name__ == "__main__":
    process_files()

关键改进点

  1. 用csv.DictReader替代索引取值:通过字段名(如row['Client'])获取数据,避免依赖列顺序,更易维护
  2. 精准匹配原文件:结合根目录、Client和OldFileName构造完整路径,解决不同子目录下同名文件的区分问题
  3. 防覆盖机制:目标文件存在时自动添加编号,彻底避免文件覆盖
  4. 跨平台路径处理:使用os.path.join替代硬编码斜杠,适配Windows/Linux/macOS系统
  5. 容错处理:跳过不存在的原文件,确保批量处理不中断

注意事项

  • 操作前务必备份所有文件,避免数据丢失
  • 先测试少量CSV行,验证路径和文件名生成是否符合预期
  • 确保CSV中的Client、OldFileName与实际文件路径完全一致(大小写敏感)

内容的提问来源于stack exchange,提问作者MzNix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:59:55