影刀RPA 文件批量重命名规则化命名的自动化方案作者林焱文件多了以后命名混乱是最大的痛点。采集的图片叫Screenshot_001.png、img_20260701.png、微信图片_20260701123456.jpg——格式五花八门。手动改几十个文件名还能忍几百上千个就崩溃了。批量重命名是RPA非常适合的场景。这篇文章把几种常见的批量重命名规则和实现方法讲全。一、基本重命名操作1.1 Python重命名importos# 重命名单个文件os.rename(D:\\data\\old_name.txt,D:\\data\\new_name.txt)1.2 批量重命名的基本模式importos directoryD:\\datafilesos.listdir(directory)forfilenameinfiles:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e605bb8d52e64e8691d21bda889ca6d7.png#pic_center)old_pathos.path.join(directory,filename)new_name新名称_filename new_pathos.path.join(directory,new_name)os.rename(old_path,new_path)坑重命名后文件列表变化os.listdir返回的列表在重命名过程中不会更新但如果新名称和旧名称的排序不同可能导致冲突。建议先获取文件列表计算出所有新旧名称映射再统一执行重命名。二、常见重命名规则店群矩阵自动化突破运营极限2.1 添加前缀/后缀importos directoryD:\\data\\imagesprefixproduct_forfilenameinos.listdir(directory):iffilename.endswith((.jpg,.png)):![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c2e6efe2e6184b8ab3c9611fd963c005.png#pic_center)old_pathos.path.join(directory,filename)new_nameprefixfilename new_pathos.path.join(directory,new_name)os.rename(old_path,new_path)print(f{filename}→{new_name})2.2 替换文件名中的字符importos directoryD:\\dataforfilenameinos.listdir(directory):if infilename:new_namefilename.replace( ,_)# 空格替换为下划线old_pathos.path.join(directory,filename)new_pathos.path.join(directory,new_name)os.rename(old_path,new_path)2.3 按序号重命名importos directoryD:\\data\\imagesfiles[fforfinos.listdir(directory)iff.endswith((.jpg,.png))]files.sort()# 按文件名排序foridx,filenameinenumerate(files,1):old_pathos.path.join(directory,filename)extos.path.splitext(filename)[1]# 保留原扩展名new_namefimage_{idx:04d}{ext}# image_0001.jpgnew_pathos.path.join(directory,new_name)os.rename(old_path,new_path)坑序号从0还是1开始enumerate(files, 1)从1开始enumerate(files)从0开始。根据需求选择。序号补零如0001可以保证排序正确。2.4 按日期重命名importosfromdatetimeimportdatetime directoryD:\\dataforfilenameinos.listdir(directory):filepathos.path.join(directory,filename)ifos.path.isfile(filepath):# 获取文件修改时间mtimeos.path.getmtime(filepath)date_strdatetime.fromtimestamp(mtime).strftime(%Y%m%d_%H%M%S)extos.path.splitext(filename)[1]new_nameffile_{date_str}{ext}new_pathos.path.join(directory,new_name)# 避免重名counter1whileos.path.exists(new_path):new_nameffile_{date_str}_{counter}{ext}new_pathos.path.join(directory,new_name)counter1os.rename(filepath,new_path)2.5 按Excel配置表重命名从Excel读取旧名称和新名称的映射表批量重命名importosimportpandasaspd# 读取映射表dfpd.read_excel(D:\\data\\rename_map.xlsx)# 列旧文件名, 新文件名directoryD:\\data\\filessuccess_count0fail_count0for_,rowindf.iterrows():old_namestr(row[旧文件名])new_namestr(row[新文件名])old_pathos.path.join(directory,old_name)new_pathos.path.join(directory,new_name)ifos.path.exists(old_path):try:os.rename(old_path,new_path)success_count1print(f✓{old_name}→{new_name})exceptExceptionase:fail_count1print(f✗{old_name}重命名失败:{e})else:fail_count1print(f✗{old_name}文件不存在)print(f\n完成成功{success_count}个失败{fail_count}个)2.6 根据文件内容重命名读取文件内容提取关键字作为文件名importosimportre directoryD:\\data\\reportsforfilenameinos.listdir(directory):ifnotfilename.endswith(.txt):continuefilepathos.path.join(directory,filename)withopen(filepath,r,encodingutf-8)asf:contentf.read()# 从内容中提取报告标题假设第一行是标题first_linecontent.split(\n)[0].strip()# 清理非法字符safe_namere.sub(r[\\/:*?|],_,first_line)new_namef{safe_name}.txtnew_pathos.path.join(directory,new_name)iffilepath!new_path:os.rename(filepath,new_path)print(f{filename}→{new_name})三、高级重命名场景3.1 递归重命名子目录中的文件frompathlibimportPath base_dirPath(D:\\data)forfilepathinbase_dir.rglob(*):iffilepath.is_file():parentfilepath.parent old_namefilepath.name# 重命名规则空格替换为下划线统一小写new_nameold_name.replace( ,_).lower()ifold_name!new_name:new_pathparent/new_name filepath.rename(new_path)print(f{filepath}→{new_path})3.2 按分类分目录重命名把文件按扩展名分类到不同目录并统一命名importosimportshutil source_dirD:\\downloadstarget_baseD:\\organized# 分类规则category_map{.jpg:images,.png:images,.gif:images,.xlsx:documents,.docx:documents,.pdf:documents,.mp4:videos,.mp3:audios,}forfilenameinos.listdir(source_dir):filepathos.path.join(source_dir,filename)ifnotos.path.isfile(filepath):continueextos.path.splitext(filename)[1].lower()categorycategory_map.get(ext,others)# 创建分类目录target_diros.path.join(target_base,category)os.makedirs(target_dir,exist_okTrue)# 移动并重命名new_namef{category}_{filename}target_pathos.path.join(target_dir,new_name)shutil.move(filepath,target_path)print(f{filename}→{category}/{new_name})3.3 去除文件名中的特殊字符importosimportre directoryD:\\dataforfilenameinos.listdir(directory):# 去除Windows非法字符safe_namere.sub(r[\\/:*?|],,filename)# 去除多余空格safe_namere.sub(r\s, ,safe_name).strip()# 去除emojisafe_namere.sub(r[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF],,safe_name)iffilename!safe_name:old_pathos.path.join(directory,filename)new_pathos.path.join(directory,safe_name)os.rename(old_path,new_path)print(f{filename}→{safe_name})3.4 批量修改扩展名importos directoryD:\\dataold_ext.jpegnew_ext.jpgforfilenameinos.listdir(directory):![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4f46cc0122eb40ebb24fd48ef3881ca4.png#pic_center)iffilename.lower().endswith(old_ext):old_pathos.path.join(directory,filename)new_namefilename[:-len(old_ext)]new_ext new_pathos.path.join(directory,new_name)os.rename(old_path,new_path)四、安全重命名的最佳实践temu店群自动化报活动案例4.1 先预览再执行importos directoryD:\\datafilesos.listdir(directory)# 先打印重命名计划print( 重命名计划 )rename_plan[]forfilenameinfiles:new_namefilename.replace( ,_).lower()iffilename!new_name:rename_plan.append((filename,new_name))print(f{filename}→{new_name})print(f\n共{len(rename_plan)}个文件将被重命名)# 确认后执行在影刀中可以用条件判断控制set_variable(rename_plan,rename_plan)set_variable(confirm_execute,True)# 由流程控制是否确认ifget_variable(confirm_execute):forold_name,new_nameinrename_plan:old_pathos.path.join(directory,old_name)new_pathos.path.join(directory,new_name)os.rename(old_path,new_path)print(重命名完成)4.2 处理重名冲突importosdefget_unique_path(directory,filename):获取不冲突的文件路径filepathos.path.join(directory,filename)ifnotos.path.exists(filepath):returnfilepath name,extos.path.splitext(filename)counter1whileos.path.exists(filepath):![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4512e20d6987414780f8b22d0c13ef19.png#pic_center)new_namef{name}_{counter}{ext}filepathos.path.join(directory,new_name)counter1returnfilepath# 使用new_pathget_unique_path(directory,new_name)os.rename(old_path,new_path)4.3 回滚机制importosimportjson directoryD:\\datalog_fileD:\\data\\rename_log.json# 记录重命名日志用于回滚rename_log[]forfilenameinos.listdir(directory):old_pathos.path.join(directory,filename)new_nameprefix_filename new_pathos.path.join(directory,new_name)os.rename(old_path,new_path)rename_log.append({old:old_path,new:new_path})# 保存日志withopen(log_file,w)asf:json.dump(rename_log,f)# 如果需要回滚defrollback():withopen(log_file,r)asf:logjson.load(f)foriteminreversed(log):os.rename(item[new],item[old])print(回滚完成)五、避坑清单坑1文件名大小写冲突Windows文件名不区分大小写File.txt和file.txt是同一个文件。重命名时如果只改大小写file.txt→File.txt直接rename可能失败。先改成临时名再改成目标名os.rename(file.txt,temp_file.txt)os.rename(temp_file.txt,File.txt)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/74e15f1c146b44bcbb5aaa86867eff31.png#pic_center)坑2文件被占用文件正在被其他程序使用重命名报错。确保文件没被打开。坑3路径太长Windows路径限制260字符加上新文件名可能超限。缩短文件名或用\\?\前缀。坑4中文文件名编码问题Python 3默认使用Unicode处理文件名一般不会有编码问题。但如果用subprocess调用命令行工具中文文件名可能乱码。坑5重命名后顺序变化批量重命名后文件的排序可能变化如果后续操作依赖文件顺序需要在重命名后重新获取文件列表。