如何用Python批量重命名文件,移除(file no *)格式后缀
解决批量移除
(file no *)格式文件名后缀的问题 你的问题在于用了str.replace()——它只能替换固定字符串,没法匹配任意数字的情况。要实现通用替换,正则表达式是最合适的工具,能精准匹配你描述的(file no *)格式后缀(*代表任意数字)。
下面是改进后的代码,我会一步步解释其中的关键点:
import os import re directoryname = "/media/username/New Volume/" listFiles = os.listdir(directoryname) print("原文件列表:") print(listFiles) for filename in listFiles: # 先过滤掉目录中的文件夹,只处理文件 full_path = os.path.join(directoryname, filename) if not os.path.isfile(full_path): continue # 正则替换核心逻辑 # 模式 r'\s*\(file no \d+\)$' 的含义: # - \s*: 匹配后缀前可能存在的0个或多个空格(避免重命名后文件名末尾留空格) # - \(file no \d+\): 匹配字面的 (file no 数字),其中 \d+ 代表1个或多个任意数字 # - $: 确保这个模式只出现在文件名的末尾,防止误改文件名中间的类似内容 new_filename = re.sub(r'\s*\(file no \d+\)$', '', filename) # 只有当文件名确实需要修改时才执行重命名操作 if new_filename != filename: os.rename(full_path, os.path.join(directoryname, new_filename)) print(f"已重命名:{filename} → {new_filename}") print("\n重命名完成后的文件列表:") print(os.listdir(directoryname))
几个重要的改进说明:
- 正则表达式的使用:
re.sub()可以根据模式匹配并替换内容,\d+完美解决了"任意数字"的匹配需求,转义的\(和\)确保匹配字面的括号。 - 过滤文件夹:添加了
os.path.isfile()判断,避免误操作目录中的子文件夹。 - 安全检查:只有当新文件名和原文件名不同时才执行重命名,避免无意义的系统调用。
- 过程可视化:增加了打印提示,能清晰看到每个文件的重命名情况,方便排查问题。
额外建议:
在执行批量重命名前,建议先备份目标目录的文件,或者先注释掉os.rename()这一行,只打印重命名的结果,确认没问题后再执行实际的重命名操作,避免意外丢失或损坏文件。
内容的提问来源于stack exchange,提问作者subtleseeker
相关产品推荐
相关产品推荐

