日常工作中经常需要批量重命名文件,比如将照片按日期排序、把下载的电子书改成统一格式。手动一个文件按F2改名,遇到几百个文件时效率极低,而且容易出错。Python的os模块和re模块可以自动完成这个任务,下面分享一套实测可用的脚本和操作流程。
首先安装Python环境。访问python.org下载3.10以上版本,安装时勾选“Add Python to PATH”。打开命令提示符输入python –version,看到版本号就说明安装成功。我的电脑是Windows 11,用管理员身份运行CMD避免权限问题。
核心脚本分为三步:读取文件名、按规则生成新名称、执行重命名。以把文件夹内所有“IMG_2024*.jpg”改成“2024-*月-*日-序号.jpg”为例。新建一个rename.py文件,写入以下代码:
import os, re
folder = r’C:\Users\你的用户名\Desktop\照片’ # 替换为实际路径
files = os.listdir(folder)
counter = 1
for f in files:
match = re.search(r’IMG_(\d{4})(\d{2})(\d{2})’, f)
if match:
y, m, d = match.group(1), match.group(2), match.group(3)
new_name = f'{y}-{m}-{d}-{counter:03d}.jpg’
os.rename(os.path.join(folder, f), os.path.join(folder, new_name))
counter += 1
print(f’共重命名{counter-1}个文件’)
运行前先在桌面建一个测试文件夹,复制几个文件试验。我第一次运行忘了改folder路径,结果报错FileNotFoundError。把路径改成自己的桌面文件夹后顺利执行。注意图片名称必须是“IMG_YYYYMMDD”格式,否则正则匹配不成功。脚本中的正则表达式需要根据你实际的文件名格式调整,比如有的是“photo(20240101)_001.jpg”,可以改成r’photo\((\d{8})\)_\d+’。
如果只想添加统一前缀或后缀,不用正则更简单。比如给所有txt文件添加“笔记-”前缀:
import os
folder = r’C:\Users\你的用户名\Desktop\文档’
for f in os.listdir(folder):
if f.endswith(‘.txt’):
os.rename(os.path.join(folder, f), os.path.join(folder, ‘笔记-‘ + f))
配合剪贴板工具,还可以用input()让用户实时输入前缀。我有个同事需要把合同编号插入文件名首位,用这脚本从手工每份5分钟缩短到3秒。
处理大量文件时建议先运行“打印新名称”的测试版,避免误操作。在os.rename前加一行print(new_name)查看结果,确认无误再删除测试行正式运行。有一次我写错了正则导致100多张照片名变成乱码,幸好之前备份了文件夹,用恢复软件才找回来。所以一定要备份!
问:脚本报错“No such file or directory”怎么办?
答:最常见原因是路径写错。检查folder变量里的文件夹是否存在,路径中的反斜杠要双写(\)或使用原始字符串(在路径前加r)。另外如果文件正在被其他程序占用(比如Word打开着),也会报错,关闭程序再试。
问:能不能一次性给不同后缀的文件加不同前缀?
答:可以。在for循环内用if判断后缀,分别拼接不同字符串。例如:if f.endswith(‘.jpg’): new_name = ‘图片-‘ + f;elif f.endswith(‘.pdf’): new_name = ‘文档-‘ + f。注意每个分支都要写os.rename,否则未匹配的文件会被跳过。
问:重命名后排序不是我想要的顺序,怎么办?
答:脚本默认按os.listdir的顺序,这个顺序通常是文件系统返回的,可能不是数字顺序。可以在循环前使用sorted()对文件列表排序。比如按修改时间排序:files = sorted(os.listdir(folder), key=lambda x: os.path.getmtime(os.path.join(folder, x))),再按这个顺序分配序号即可。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2305938578@qq.com 举报,一经查实,本站将立刻删除,本文链接:https://www.spubm.cn/70320.html
