基于CSV列批量重命名子目录文件并移动至可变路径求助
批量重命名并移动子目录文件(基于CSV配置)
需求说明
现有数百个文件分散在不同子目录中,需完成以下操作:
- 先在原位置重命名:避免移动时同名文件互相覆盖
- 按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配置示例
| Client | RequestID | OldFileName | Type | Date |
|---|---|---|---|---|
| A | 123456 | new_reqest_11_02_01.pdf | F | 11_02_01 |
| B | 123964 | new_reqest_11_03_01.pdf | R | 11_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()
关键改进点
- 用
csv.DictReader替代索引取值:通过字段名(如row['Client'])获取数据,避免依赖列顺序,更易维护 - 精准匹配原文件:结合根目录、
Client和OldFileName构造完整路径,解决不同子目录下同名文件的区分问题 - 防覆盖机制:目标文件存在时自动添加编号,彻底避免文件覆盖
- 跨平台路径处理:使用
os.path.join替代硬编码斜杠,适配Windows/Linux/macOS系统 - 容错处理:跳过不存在的原文件,确保批量处理不中断
注意事项
- 操作前务必备份所有文件,避免数据丢失
- 先测试少量CSV行,验证路径和文件名生成是否符合预期
- 确保CSV中的
Client、OldFileName与实际文件路径完全一致(大小写敏感)
内容的提问来源于stack exchange,提问作者MzNix
相关产品推荐
相关产品推荐

