首页/新闻资讯/正文详情

Python批量重命名文件:5分钟写脚本告别手动改名

发布时间:2026/9/26 6:32:28 来源:云帆数科 栏目:资讯中心
Python批量重命名文件:5分钟写脚本告别手动改名
告别手动改文件名5分钟写个Python脚本批量搞定所有文件重命名先说一下我自己的经历。前阵子帮朋友整理一个摄影项目相机导出来的素材全是IMG_0234.jpg、IMG_0235.jpg这种名字完全看不出内容。几百个文件要按拍摄日期、地点、序号重新命名一个个手动改改到一半就想砸电脑。后来我花五分钟写了个 Python 脚本把整个文件夹的文件一次性处理完朋友当场愣住“这活儿你平时都靠这个”从那以后批量文件重命名就成了我处理素材、整理下载目录、归档项目文件时最常用的一个小工具。今天这篇文章就是来分享这个方法的。不管你是完全没写过代码的小白还是已经会一点 Python 但没系统整理过文件操作的朋友看完都能自己动手写一个顺手的小脚本。我们会从最基础的需求拆解开始讲到os模块和pathlib的用法再给出一套可以直接抄走的完整代码最后还会分享我踩过的坑和排查经验。整体写下来你会发现批量重命名这件事真没必要手动一个个来。1. 批量重命名背后的核心需求与解决思路1.1 为什么手动改名让人抓狂手动重命名的痛点干过的人都有体会。文件一多光是“选中、右键、重命名、输入、回车”这一套动作就要重复几百次手指累不说脑子更容易乱。更麻烦的是很多时候命名规则不是简单地加个序号而是要把日期、地点、项目名、类别等信息拼进去。比如你有一批合同扫描件希望文件名变成合同_2025-03月_供应商A_01.pdf手动操作就特别容易出错序号敲错两个文件重名系统直接拒绝。日期填错事后想按文件名排序就全乱了。改到一半忘记改到哪了前后编号不一致整个文件夹看起来乱七八糟。我曾经试过用系统自带的“全选后重命名”功能Windows 会给所有文件加上文件名 (1)、文件名 (2)这种格式。但问题是它不能自由组合日期、分类、原文件名这些信息而且处理完的文件名还是没什么辨识度基本等于没解决问题。1.2 用 Python 解决的核心思路Python 解决这个问题的思路其实很清晰用代码读取文件夹里的所有文件名按照定义好的规则生成新文件名然后执行重命名操作。整个过程分四步定位目标文件夹。获取文件夹里所有文件的列表。对每个文件名做解析和转换生成新名字。调用系统重命名接口把旧名字换成新名字。这套思路的优势在于规则一旦定好执行就是稳定、可复现的。不管文件是 10 个还是 1000 个脚本执行的时间差不了太多。而且因为规则是写出来的你可以在真正重命名之前先“预演”一遍把新旧文件名对照表打印出来检查确认无误后再真正动手。说穿了这就是用一段确定的逻辑替代重复的手工操作。和 Excel 里用公式批量处理数据是一个道理——先定义规则再一次性应用而不是一个个单元格去改。1.3 选 Python 而不选其他方案的原因可能有人会问Windows 自带的重命名工具、第三方批量改名软件不是也能做吗为什么非要 Python我的看法是第三方软件确实方便但有两个局限。一是规则定制能力有限复杂规则往往要付费版才开放二是没法“沉淀”下来。你用鼠标点出来的规则下次换一批文件可能又要重新配置一遍。而脚本是文本文件可以保存、复用、修改。我自己的习惯是把常用脚本按场景分类存到一个文件夹里遇到“整理照片”“清理下载目录”“归档合同”就对应跑一个参数改一下就行效率完全是另一回事。Python 在这个场景里还有个隐藏优势生态。你今天是批量重命名明天可能就要按 EXIF 信息整理照片后天要把文件名提取的信息写入 Excel。这些需求 Python 都能无缝衔接因为你用的是同一套语言和思维模式。2. 动手前必须掌握的两个核心模块2.1os模块Python 操作文件的老牌主力要说批量重命名os模块是绕不开的基础。它提供的功能很直接读写文件属性、创建目录、列举目录内容、重命名文件等。最常用的几个函数是os.listdir(path)列出指定目录下所有文件和子目录的名字返回一个列表。os.rename(old_name, new_name)把旧文件名改成新文件名。os.path.splitext(filename)把文件名拆成“主名”和“扩展名”两部分。os.path.join(path1, path2)把目录路径和文件名拼成完整路径自动处理分隔符。os.path.isfile(path)判断路径对应的是不是文件。举个例子感受一下。假设我们要把一个叫pic1.jpg的文件重命名为旅行_01.jpgimport os old_name pic1.jpg new_name 旅行_01.jpg os.rename(old_name, new_name)就这么简单。但注意os.rename只能处理两个名字不能自动加序号、不能批量。所以我们的脚本要做的就是用一个循环把文件夹里每个文件都执行一次这个操作。2.2pathlib模块更现代、更省心的文件路径处理如果你是新学 Python我建议你直接从pathlib入手。这是 Python 3.4 以后加入的标准库把路径当成对象来操作整体体验比os.path拼字符串舒服得多。同一件事用pathlib写是这种感觉from pathlib import Path folder Path(D:/照片/2025年3月) for file_path in folder.iterdir(): if file_path.is_file(): print(file_path.name) # 文件名不含路径 print(file_path.stem) # 主名不含扩展名 print(file_path.suffix) # 扩展名比如 .jpg print(file_path.parent) # 所在目录iterdir()直接遍历目录is_file()判断是不是文件.name拿文件名.stem拿主名.suffix拿后缀。没有一堆字符串拼接逻辑清楚很多。我个人的建议是日常脚本用pathlib写读起来比os舒服但如果你维护的是老项目里面全是os.path那就跟着现有代码风格走不要混用。两种方式都能完成任务关键是别让自己糊涂。2.3 老手常用的几个路径细节不管用哪个模块有几个细节是刚接触文件操作的人经常忽略的Windows 路径建议用Path(D:/素材)这种正斜杠写法或者直接在路径字符串前加r变成原始字符串比如rD:\素材。否则反斜杠\n会被解析成换行符踩坑概率极高。如果你想让脚本在任意电脑上都能跑最好在脚本开头用input()让用户输入文件夹路径或者用Path.home()获取用户主目录不要在代码里写死一个路径。处理完一批文件后如果需要检查结果可以再用folder.iterdir()把新文件名打印出来看一遍确认没有重名、没有奇怪字符。3. 从零写一个足够通用的批量重命名脚本3.1 先说清楚目标场景我这里设计的脚本解决的是最常见的三种需求给文件加统一前缀比如所有素材文件前面加上项目名。给文件按顺序加编号比如001、002、003。用原文件的修改日期拼进新文件名比如20250315_001.jpg。这三种场景覆盖了绝大多数个人整理文件的需求。你不需要一次写一个完美无缺的“万能脚本”只要能解决眼前的问题再留一点扩展空间就够了。3.2 完整代码可以直接抄走下面这个脚本我日常在用改动不大。主要有两个模式加前缀、加日期前缀加编号。from pathlib import Path from datetime import datetime def batch_rename(folder_path, modeprefix, prefix, start_num1): 批量重命名脚本支持两种模式 - prefix: 在原名前面加前缀例如 项目A_旅行照片.jpg - date_number: 用文件修改日期 序号作为新文件名例如 20250315_001.jpg folder Path(folder_path) if not folder.exists(): print(f目录不存在{folder_path}) return files [f for f in folder.iterdir() if f.is_file()] if not files: print(该目录下没有找到任何文件。) return # 先把文件按名称排序保证编号顺序稳定 files.sort(keylambda x: x.name.lower()) print(以下文件将被重命名) rename_pairs [] for index, file_path in enumerate(files, startstart_num): if mode prefix: new_name f{prefix}{file_path.name} elif mode date_number: mtime file_path.stat().st_mtime date_part datetime.fromtimestamp(mtime).strftime(%Y%m%d) suffix file_path.suffix.lower() new_name f{date_part}_{index:03d}{suffix} else: print(f未知模式{mode}) return new_path folder / new_name rename_pairs.append((file_path, new_path)) for old_path, new_path in rename_pairs: print(f{old_path.name} - {new_path.name}) confirm input(确认执行重命名输入 y 确认直接回车取消) if confirm.strip().lower() y: for old_path, new_path in rename_pairs: if old_path.resolve() new_path.resolve(): continue if new_path.exists(): print(f跳过{new_path.name} 已存在无法覆盖。) continue old_path.rename(new_path) print(f已重命名{old_path.name} - {new_path.name}) else: print(已取消未做任何修改。)3.3 脚本里的关键设计逐个解释这段代码看起来不长但里面有几个细节恰好是容易出问题的点。第一个是排序。遍历文件之前我先把文件列表按文件名排序了。这样做的好处是编号出来的顺序是稳定可预期的不会一会儿是 A 文件在前面一会儿变成了 C 文件。如果你不排序iterdir()返回顺序由文件系统决定在不同机器上可能完全不一样那编号就会乱。第二个是重名保护。脚本在真正执行重命名之前会检查new_path是否已经存在如果存在就跳过。这一步很重要因为两个文件改完变成同一个名字系统会直接报错或者覆盖文件就找不回来了。宁可这次跳过也比丢失文件强。第三个是确认机制。我先打印出所有旧名字到新名字的对应关系让用户输入y确认后才动手。这和“先在草稿上检查一遍再誊写”是一个道理。批量操作最大的风险就是改完后悔所以多一道确认值得。第四是日期处理。file_path.stat().st_mtime拿到的是 Unix 时间戳我再用datetime.fromtimestamp()转成可读日期然后格式化成年月日。这样输出的文件名像20250315_001.jpg一看就知道是什么时候的文件。3.4 实际运行效果长什么样假设我有个文件夹叫D:/照片/三月素材里面有这些文件风景1.jpg 风景2.jpg 家人的合影.png 随手拍.jpg在命令行里运行脚本选择date_number模式执行效果大概是风景1.jpg - 20250310_001.jpg 风景2.jpg - 20250310_002.jpg 家人的合影.png - 20250314_003.png 随手拍.jpg - 20250315_004.jpg 确认执行重命名输入 y 确认直接回车取消y 已重命名风景1.jpg - 20250310_001.jpg 已重命名风景2.jpg - 20250310_002.jpg 已重命名家人的合影.png - 20250314_003.png 已重命名随手拍.jpg - 20250315_004.jpg如果选prefix模式结果会更直观风景1.jpg - 旅行计划_风景1.jpg 风景2.jpg - 旅行计划_风景2.jpg 家人的合影.png - 旅行计划_家人的合影.png 随手拍.jpg - 旅行计划_随手拍.jpg这样一来文件名一下子就统一了按名字排序也比之前有规律得多。4. 把原文件名“翻译”成新文件名的高级玩法4.1 一个真实场景把中文名转成拼音文件名有次我需要把一批中文命名的课程资料上传到某个老旧的档案系统对方系统不支持中文文件名全部乱码。手动一个个翻译又要疯了。这时候脚本的优势就出来了我们可以调用拼音库把中文名转成拼音再拼接成新文件名。依赖库装一下就行pip install pypinyin核心逻辑很简单from pypinyin import lazy_pinyin def to_pinyin(name): return _.join(lazy_pinyin(name)) old_name 高等数学第一章.pdf new_name to_pinyin(old_name) print(new_name) # gao_deng_shu_xue_di_yi_zhang.pdf如果你想在文件名里保留原来的信息也可以拼起来比如高等数学第一章_gao_deng.pdf这样人眼能看懂系统也不会乱码。这个思路可以延伸很多英文名转大写、空格替换成下划线、去掉特殊符号、日期格式统一等。本质上都是“对原文件名做字符串处理”规则自己定脚本就是执行规则的工具。4.2 用原文件信息生成更智能的文件名除了纯字符串翻译我们还可以读取文件的元数据来生成新名字。常见的元数据包括修改时间file_path.stat().st_mtime创建时间Windows 上可以用st_ctime但注意在不同系统上含义不一样文件大小file_path.stat().st_size图片的拍摄时间通过PIL库读取 EXIF 信息有一次我给相机导出的照片归档就是用读取 EXIF 拍摄时间的方式按日期重组了文件夹结构文件名也改成拍摄时间的格式。这样导出的照片直接传云盘按文件名排序就是时间排序找照片快了很多。from PIL import Image from PIL.ExifTags import TAGS def get_photo_date(file_path): try: img Image.open(file_path) exif img.getexif() if exif: for tag_id, value in exif.items(): tag_name TAGS.get(tag_id, tag_id) if tag_name DateTimeOriginal: return str(value).replace(:, ).replace( , _) except Exception: pass return None这样读出来的文件名可能是20250315_142530_001.jpg精确到了秒。这个方法比依赖文件修改时间更靠谱因为修图软件保存文件时修改时间可能被覆盖但 EXIF 里的拍摄时间不会被改动。4.3 批量重命名多个文件夹里的文件有时候文件不只有一个文件夹而是按月份分了多个目录。逐个目录跑脚本太麻烦了我们可以再套一层循环遍历所有子目录from pathlib import Path root Path(D:/项目归档) for folder in root.iterdir(): if folder.is_dir(): batch_rename(folder, modeprefix, prefix归档_)这样一层一层处理下去几十个文件夹几分钟就能搞定。这也是脚本复用价值最明显的地方规则定义一次应用到所有目录。5. 常见问题与排查技巧实录5.1 问题一提示文件找不到或者名称错误很多新手遇到的第一个报错就是FileNotFoundError。多半原因不是文件不存在而是路径没写对。特别是 Windows 下直接复制出来的路径常常自带反斜杠Python 里会被解析成转义字符。解决办法很简单用Path对象而不是字符串from pathlib import Path folder Path(D:/项目归档/2025年3月)如果是从命令行复制路径看到的是D:\项目归档\2025年3月直接改成上面的写法就行。要么用原始字符串Path(rD:\项目归档\2025年3月)。5.2 问题二重命名后文件跑到别处去了有次我用os.rename(old_name, new_name)传的路径一个是绝对路径一个是相对路径结果文件被移到了当前工作目录找了好久。这个问题的根源是路径基准不一致。建议所有操作都基于同一个 Path 对象来处理比如都用folder / old_name和folder / new_name不要一会儿用相对路径一会儿用绝对路径。最简单的方式是脚本里所有文件路径都由那个folder变量派生出来。5.3 问题三文件名里带点导致扩展名丢了有的文件名本身包含多个点比如2025.03.15 风景.jpg。如果直接用split(.)[0]取主名只会保留第一个点前面的部分后面的就全乱了。正确做法是用pathlib的.stem和.suffix它会自动把最后一个点当成扩展名分隔符name 2025.03.15 风景.jpg p Path(name) print(p.stem) # 2025.03.15 风景 print(p.suffix) # .jpg别自己手工切分文件名规则太多很容易出错。5.4 问题四执行到一半发现规则错了这时候如果你是直接跑的脚本很可能已经改了一批文件改错的文件名字就乱了。所以我会在脚本里加一个“预演”功能先打印所有新旧对照不执行真正的重命名。确认无误后再手动输入确认符执行。你也可以在脚本最前面加一个dry_run变量默认设成True等确认无误再改成False运行。这样可以把“看效果”和“真正执行”分开安全很多。5.5 问题五只想处理特定类型的文件有时候一个文件夹里有图片、文档、压缩包我只想重命名 jpg 文件其他文件不要动。过滤条件很简单files [f for f in folder.iterdir() if f.is_file() and f.suffix.lower() .jpg]也可以过滤包含某些关键字的文件files [f for f in folder.iterdir() if 临时 in f.name]这个能帮你避开那些不需要动的系统文件、隐藏文件、备份文件。5.6 问题六PowerShell 或命令行运行 Python 时报错运行脚本时不熟悉命令行会出现类似“无法将 xxx 项识别为 cmdlet、函数、脚本文件或可运行程序的名称”或者提示 python 命令找不到。这个通常不是脚本的问题而是 Python 没装好或者没加到系统环境变量里。解决思路先确认 Python 装没装。在 PowerShell 或命令行里敲python --version有版本号说明装好了。如果提示找不到就重新安装 Python安装时记得勾选Add Python to PATH。安装好之后在目标文件夹里打开命令行输入python 脚本名.py就能跑。如果你嫌命令行麻烦也可以用 VS Code 打开文件夹在编辑器里直接运行脚本。下载 VS Code 后装一个 Python 扩展打开.py文件点右上角三角形运行就行对新手友好很多。6. 我的实操心得和使用建议6.1 重命名前先想清楚命名规则写脚本本身五分钟就够了真正花时间的是想清楚“新文件名应该长什么样”。我一般会先手动改三五个文件把规则定型再写脚本套用到全部文件。比如我整理照片时会先确定格式是日期_序号.jpg然后想清楚“日期取拍摄日还是修改日”这两者选错了后面整个文件夹都会乱。定规则的时候建议也考虑排序问题。文件管理器排序通常按字符顺序所以如果希望按时间排序文件名开头最好就是日期而且是YYYYMMDD这种格式。不要用03月15日因为排序时你会发现 10 月排在 2 月前面根本对不上。6.2 重要文件先备份永远不要嫌麻烦批量重命名是“不可撤销”的操作。系统没有回收站给文件夹里的人看操作记录一旦改错想靠手工找回难度极大。所以我哪怕脚本写得再熟面对重要文件夹也一定先复制一份备份到临时目录。等确认脚本结果没问题再删掉备份。特别是涉及照片、合同、论文这些没有第二份的数据备份是底线。这条经验是踩了坑才总结出来的。6.3 把这套脚本沉淀成你自己的工具箱我自己电脑里有一个scripts目录专门放这些实用小脚本。每个脚本开头我都写了注释说明这个脚本是干嘛的、参数怎么改、适用于什么场景。碰到类似需求直接复制改个目录路径就能用五分钟都不用。建议大家也建立这个习惯。脚本的价值不在于一次跑完而在于下次遇到类似问题时你可以不用重新想思路直接把它拿出来改造。慢慢地你会发现自己处理文件越来越快也越来越少做重复劳动。6.4 从重命名开始进入自动化的世界批量重命名是很小的一件事但它背后体现的思维方式是可以迁移的凡是重复三次以上的操作都值得把它脚本化。整理桌面、清洗重复文件同步目录、批量改图片尺寸、下载网页里的资源……这些都可以用 Python 逐步自动化。一开始不用想太多就先从今天这个小脚本开始。找到你电脑里那个乱糟糟的文件夹定一个命名规则敲几行代码跑一遍你会立刻感受到“编写工具”和“使用工具”之间的差距。这种掌握感一旦尝到就回不去了。

相关推荐

AI代理工作流实战:500美元替代5万美元团队的成本与落地
AI代理工作流实战:500美元替代5万美元团队的成本与落地

1. 这场“500 美元替代 5 万美元团队”的讨论,到底在说什么最近圈子里聊得最多的一件事,就是有人用一套 AI 代理工作流,把原本需要一个小团队才能完成的软件交付流程压缩到了一个人加几百美元 API 成本。标题里那个“500 美元替代 5 万美元团… · 2026/9/26 6:32:22

AI Agent 实战:从大模型到智能代理的工程化落地
AI Agent 实战:从大模型到智能代理的工程化落地

软件装上大脑这件事,听起来像科幻,但落到工程实践里,它其实是一个非常具体的命题:怎么让一个只会"你问我答"的大模型,变成能自己拆任务、自己调工具、自己检查结果、自己决定下一步的代理。MultiOn 就是在这… · 2026/9/26 6:32:22

开源大模型新选择:Xiaomi MiMo v2.6 Pro 的设计思路与工程落地
开源大模型新选择:Xiaomi MiMo v2.6 Pro 的设计思路与工程落地

开源大模型又添新面孔:聊聊 Xiaomi MiMo v2.6 Pro 的设计思路与实际落地年开源模型圈一直没消停,前有各种大参数怪兽,后有主打轻量高效的紧凑模型。最近我留意到 Xiaomi MiMo v2.6 Pro 这个 open-weight LLM,热度不低,… · 2026/9/26 6:32:22

设备采购部经理绩效考核指标量表设计与应用方案
设备采购部经理绩效考核指标量表设计与应用方案

在企业运营中,设备采购不仅关乎成本控制,更直接影响生产效率和项目进度。为了全面评估设备采购部经理的绩效,必须建立一套科学、量化的考核体系。 本文从KPI指标出发,细致拆解了采购计划完成率、资金节约率、设备质量合格率等关键指标,明确了每项指标的定义、计算方式和数… · 2026/9/26 7:01:20

设备采购人员绩效评估方案与指标体系优化
设备采购人员绩效评估方案与指标体系优化

在设备采购工作中,如何科学评估采购人员的工作成效,是企业控制成本、提升效率、保障质量的关键。本方案围绕采购人员的核心职责,从采购成本、效率、质量控制到个人表现,设计了一套清晰可操作的绩效考核框架。 结合统计学、机器学习和深度学习等方法,不仅提供了量化的评价… · 2026/9/26 7:01:20

Linux USB协议栈架构详解:从URB传输到设备驱动调试
Linux USB协议栈架构详解:从URB传输到设备驱动调试

做Linux下USB驱动调试的这些年,我最大的感受就是:USB协议栈就像一棵盘根错节的树,表面上看到的是/dev/ttyUSB0、U盘挂载这些结果,底下却藏着从硬件控制器、内核核心层、主机控制器驱动到设备驱动的完整链条。很多人被USB驱动问题卡… · 2026/9/26 7:01:14

Modbus采集+SNMP上报:楼宇温湿度监测系统实战解析
Modbus采集+SNMP上报:楼宇温湿度监测系统实战解析

前阵子给一栋写字楼做温湿度监测改造,甲方要求把机房、档案室、设备间的环境数据统一送进运维网管平台。扒了一圈现场设备,能稳定走Modbus TCP/UDP的传感器最多,而楼宇自控和网管侧普遍认SNMP,于是这套“Modbus采集SNMP上报”的组… · 2026/9/26 7:01:14

工业机器人SRVO-230报警本质是供电合规性失效
工业机器人SRVO-230报警本质是供电合规性失效

1. 为什么SRVO-230报警不是“机器人坏了”,而是供电系统在喊救命你刚把一台标着“200V/50Hz”的日本产工业机器人运到东南亚某制造基地,接上当地三相380V/60Hz电网,按下启动键——机械臂还没抬起来,示教器就弹出红色警告&#xff… · 2026/9/26 7:01:14

UE5.8原生MCP协议集成Codex实战指南
UE5.8原生MCP协议集成Codex实战指南

1. 项目概述:这不是插件安装,而是一次编辑器级的协议嵌入“【UE5】- UE MCP :在UE5.8编辑器中内置链接Codex”——这个标题里藏着三个关键信号:第一,“UE5.8”不是泛指,而是明确指向2024年Q2发布的正式稳定… · 2026/9/26 7:01:02

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码