《超简单:用 Python 让 Excel 飞起来》读书笔记:3.2.4 重命名文件和文件夹:os.rename(src, dst)) 个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化[TOC](《超简单用 Python 让 Excel 飞起来》读书笔记3.2.4 重命名文件和文件夹os.rename(src, dst))1. 3.2.4 重命名文件和文件夹os.rename(src, dst)这一篇是我阅读《超简单用 Python 让 Excel 飞起来》时整理的读书笔记主题是3.2.4 重命名文件和文件夹os.rename(src, dst)。这一节开始代码不再只是“查看文件”“扫描目录”而是进入真正会改变文件状态的操作重命名、移动、归档和整理。前面已经学过os.listdir()用来扫描目录os.path.splitext()用来拆分文件名和扩展名os.path.join()用来拼接完整路径。到了os.rename(src, dst)这些知识就开始串起来了先找到文件再计算新路径最后执行重命名或移动。os.rename(src, dst)的本质很简单把 src 这个路径改成 dst 这个路径。如果路径只改了文件名它就是重命名如果路径里的目录也变了它就变成了移动。这张图展示的是os.rename(src, dst)的整体作用既可以重命名 Excel 文件也可以重命名文件夹。从图中可以看到old.xlsx可以通过os.rename()改成new.xlsx旧文件夹也可以改成新文件夹。这里要注意一个关键点重命名操作会直接影响真实文件执行前必须先确认路径是否正确。和读取文件不同重命名属于“改动型操作”不能随手运行。正确不确定扫描目录拼接源路径 src计算目标路径 dst确认路径是否正确执行 os.rename src dst先 print 预览验证文件名或位置是否变化这个流程图就是本节最基础的操作逻辑。我的建议是凡是涉及批量重命名、批量移动的脚本都不要一上来直接执行os.rename()先用print()把源路径和目标路径打印出来确认没问题后再真正执行。2. os.rename 的基本用法重命名和移动不是两回事os.rename(src, dst)有两个参数src是原路径dst是目标路径。很多新手容易把它理解成“只改名字”其实不准确。它改的是路径只要目标路径和原路径不同就可能产生两种结果。第一种情况是同目录改名。比如原文件在C:\Temp\data目录下目标文件也在同一个目录下只是文件名从old.xlsx改成new.xlsx这就是重命名。importos srcrC:\Temp\data\old.xlsxdstrC:\Temp\data\new.xlsxos.rename(src,dst)第二种情况是跨目录移动。比如原文件在C:\Temp\data目录下目标路径变成C:\Temp\backup目录下那么这就是移动。如果目标文件名也变了那就是“移动 改名”同时发生。importos srcrC:\Temp\data\report.xlsxdstrC:\Temp\backup\report.xlsxos.rename(src,dst)这张图展示的是“重命名”和“移动”的区别左侧是同目录改名右侧是跨目录移动。从图中可以看出同目录改名只是改变文件名部分跨目录移动则是文件所在目录发生了变化。所以判断os.rename()到底是在重命名还是移动关键不是看函数名而是看dst的路径和src相比到底变了哪里。推荐做法是写脚本时把 src 和 dst 都打印出来。这样可以清楚看到文件从哪里来、要到哪里去。如果只是看变量名很容易误判。print(源路径,src)print(目标路径,dst)# os.rename(src, dst)这里先把os.rename()注释掉是为了避免误操作。等你确认打印出来的路径完全正确再取消注释执行。这一步很笨但很安全。3. 实战一批量给 Excel 文件加前缀办公自动化里批量重命名文件是非常常见的场景。比如一个文件夹里有很多 Excel 文件原始文件名分别是销售.xlsx、报表.xlsx、库存.xlsx现在想统一改成处理后_销售.xlsx、处理后_报表.xlsx、处理后_库存.xlsx。这个需求看起来简单但里面其实用到了多个知识点先用os.listdir()遍历目录再用os.path.isfile()判断是不是文件再用endswith(.xlsx)筛选 Excel 文件最后用os.rename()执行重命名。importos folderrC:\Temp\datafornameinos.listdir(folder):full_pathos.path.join(folder,name)ifnotos.path.isfile(full_path):continueifnotname.lower().endswith(.xlsx):continueroot,extos.path.splitext(name)new_name处理后_rootext srcfull_path dstos.path.join(folder,new_name)print(重命名,src,-,dst)# os.rename(src, dst)这张图展示的是批量给 Excel 文件加前缀的效果原始文件名统一变成处理后_原名.xlsx。从图中可以看出脚本并不是手动一个一个改文件名而是批量扫描文件夹中的 Excel 文件然后自动拼出新的文件名。这个场景非常适合处理报表归档、批量下载文件整理、月度数据文件统一命名等工作。这里最容易踩坑的是没有先预览直接执行重命名。一旦批量改错虽然不一定造成数据丢失但恢复文件名会非常麻烦。所以我建议先保留print()确认路径和新文件名正确再打开os.rename()那一行。如果想进一步稳一点可以加一个判断如果目标文件已经存在就跳过避免覆盖或报错。ifos.path.exists(dst):print(目标文件已存在跳过,dst)continueos.rename(src,dst)批量重命名的安全原则是先筛选、再预览、最后执行。不要把这类脚本写成“一运行就改文件”否则现场用起来风险很高。4. 实战二按扩展名归档 Excel 文件除了批量改名os.rename()还有一个很实用的用途按扩展名移动文件。比如一个文件夹里既有.xlsx也有.docx、.txt、.pdf现在想把所有 Excel 文件统一移动到excel文件夹中。这个操作本质上还是os.rename(src, dst)。区别在于dst不再是原目录里的新文件名而是目标目录里的路径。importos folderrC:\Temp\datatargetos.path.join(folder,excel)ifnotos.path.exists(target):os.makedirs(target)fornameinos.listdir(folder):srcos.path.join(folder,name)ifnotos.path.isfile(src):continueifnotname.lower().endswith(.xlsx):continuedstos.path.join(target,name)print(移动,src,-,dst)# os.rename(src, dst)这张图展示的是按扩展名归档的效果源文件夹中只把.xlsx文件移动到excel文件夹中其他类型文件不处理。从图中可以看出这个脚本的关键不是“移动所有文件”而是只移动符合条件的文件。也就是说if not name.lower().endswith(.xlsx)这一行就是过滤条件只有 Excel 文件才会进入后续移动逻辑。这个场景本质上是“扫描目录 → 判断扩展名 → 创建目标目录 → 移动文件”。把这个模型掌握后以后就可以扩展成按图片、PDF、Word、压缩包等类型进行自动归档。不是文件是文件否是扫描源文件夹判断是否为文件跳过是否为 .xlsx创建 excel 目标文件夹计算目标路径 dst执行 os.rename 移动文件这里有一个细节不能忽略目标目录必须先存在。如果excel文件夹不存在直接把文件移动过去很容易出现FileNotFoundError。所以正式执行前先用os.makedirs()创建目标目录是比较稳的写法。5. 常见坑os.rename 不是无风险操作os.rename()的语法很简单但真正使用时并不算低风险。它直接改动文件名或文件位置一旦路径写错、目标文件已存在、文件正在被占用就可能出现异常。对于办公自动化脚本来说这些异常不是小问题因为它们往往发生在批量处理过程中。第一个常见坑是目标目录不存在。比如你想把文件移动到C:\Temp\backup但这个文件夹还没创建脚本就会失败。解决办法是执行前先判断目标目录不存在就创建。target_dirrC:\Temp\backupifnotos.path.exists(target_dir):os.makedirs(target_dir)第二个常见坑是目标文件已经存在。比如你要把report.xlsx移动到目标目录但目标目录里已经有同名文件这时就要决定是跳过、改名还是加时间戳。我的建议是默认不要覆盖先跳过并记录。ifos.path.exists(dst):print(目标已存在跳过,dst)continue第三个常见坑是文件被 Excel 占用。如果文件正在被 Excel 打开Windows 下很容易出现PermissionError。这不是 Python 语法问题而是文件句柄被占用。这张图展示的是os.rename()常见风险和安全做法包括目录不存在、文件已存在、文件被占用以及文件夹安全重命名。从图中可以看到真正稳妥的做法不是“写完代码就执行”而是先检查、后操作。先 print 再执行、先判断目标是否存在、先关闭占用文件这是批量文件操作里最基础的安全习惯。文件夹重命名也要单独注意。文件夹里面可能包含大量子文件、深层目录、权限继承和正在被占用的文件。只改同一父目录下的最后一级文件夹名通常比较安全跨目录移动整个文件夹风险会明显变高。importos parentrC:\Tempold_namedatanew_namedata_备份srcos.path.join(parent,old_name)dstos.path.join(parent,new_name)ifos.path.exists(dst):print(目标文件夹已存在停止,dst)else:print(重命名文件夹,src,-,dst)# os.rename(src, dst)跨目录移动文件夹时要更谨慎。因为一旦里面有文件被占用、路径过长、权限不一致就可能导致操作失败。对于企业环境里的办公文件夹、共享目录、同步目录最好先做小范围测试不要直接全量移动。6. 我建议的安全写法先预览再执行如果让我把这一节压缩成一个实战建议那就是所有批量重命名和批量移动脚本都应该先支持预览模式。也就是先打印出计划执行的动作不真正改文件确认无误后再开启执行模式。下面这个版本就比较适合作为练习模板。它会先扫描目录下的 Excel 文件并计划给文件名加上处理后_前缀。默认只打印不执行。importos folderrC:\Temp\datadry_runTrue# True 表示只预览不真正执行fornameinos.listdir(folder):srcos.path.join(folder,name)ifnotos.path.isfile(src):continueifnotname.lower().endswith(.xlsx):continueroot,extos.path.splitext(name)new_name处理后_rootext dstos.path.join(folder,new_name)print(计划重命名,src,-,dst)ifos.path.exists(dst):print(目标已存在跳过,dst)continueifnotdry_run:os.rename(src,dst)这里的dry_run是一个很实用的开关。设置为True时只预览设置为False时才真正执行。这个思路在批量文件操作、批量改名、批量删除、批量移动里都很重要。如果后续要写成正式工具还可以加日志把每一次计划操作和实际操作记录下来。这样即使出现问题也能回头查清楚到底哪个文件被改了、改成了什么。withopen(rename_log.txt,a,encodingutf-8)aslog:log.write(f{src}-{dst}\n)我的判断是批量文件操作最重要的不是代码写得短而是可预览、可验证、可回溯。这也是办公自动化脚本和普通练习代码最大的区别。7. 总结提升os.rename 是文件整理自动化的起点这一节我最后记成一句话os.rename(src, dst)不是简单的“改名函数”而是一个通过改变路径来完成重命名和移动的文件操作入口。同目录下改变文件名就是重命名目标目录发生变化就是移动如果同时改变目录和文件名那就是移动时顺便改名。理解这一点后很多文件整理类办公自动化需求就能写出来。但也正因为它能直接改动真实文件所以使用时必须谨慎。不要在没有预览、没有备份、没有目标检查的情况下直接批量执行。尤其是处理工作文件、共享目录、用户资料目录时更要先小范围测试。对 Python Excel 办公自动化来说这一节的价值不只是学会一个函数而是开始建立“文件批量整理”的能力。比如批量改名、按类型归档、按日期整理、按项目分类、生成备份目录这些都可以在os.rename()的基础上继续扩展。我的建议是把os.rename()和os.listdir()、os.path.join()、os.path.splitext()放在一起练。只要这几个函数组合熟了很多重复性的文件整理工作就可以交给 Python 去做。 返回顶部点击回到顶部