如何批量删除文件名中可变的.NiXXNjXX后缀?
批量删除文件名末尾指定可变部分的解决方案
你的代码里的问题在于:.Ni*Nj*是glob通配符语法,但你把它当成普通字符串用in判断,而实际文件名里没有*字符,所以这个判断永远不成立,自然不会执行重命名操作。下面给你几种可行的实现方法:
方法一:用rsplit分割字符串
目标删除的部分是从.Ni开始到.txt之前的内容,直接从右侧以.Ni为分割点拆分一次,取前缀部分再加.txt即可:
import os rootdir = r"C:\Py Practice\Sorted File Groups\nmdAnmd" for filename in os.listdir(rootdir): # 只处理txt文件,避免误操作其他类型文件 if filename.endswith(".txt") and ".Ni" in filename: # 从右侧按.Ni分割一次,取前面的前缀部分 prefix = filename.rsplit(".Ni", 1)[0] new_filename = f"{prefix}.txt" old_path = os.path.join(rootdir, filename) new_path = os.path.join(rootdir, new_filename) os.rename(old_path, new_path)
方法二:用正则表达式精准匹配替换
如果要删除的.NiXXNjXX中XX是数字,用正则可以精准匹配该模式,避免误删其他包含.Ni的内容:
import os import re rootdir = r"C:\Py Practice\Sorted File Groups\nmdAnmd" # 匹配.Ni后接数字、Nj后接数字的固定模式 pattern = re.compile(r"\.Ni\d+Nj\d+") for filename in os.listdir(rootdir): if filename.endswith(".txt"): new_filename = pattern.sub("", filename) # 只有文件名确实发生变化时才执行重命名 if new_filename != filename: old_path = os.path.join(rootdir, filename) new_path = os.path.join(rootdir, new_filename) os.rename(old_path, new_path)
方法三:用glob匹配目标文件再处理
先用glob筛选出所有符合.Ni*Nj*.txt模式的文件,再批量处理,不用遍历目录下所有文件,效率更高:
import os import glob rootdir = r"C:\Py Practice\Sorted File Groups\nmdAnmd" # 构造glob匹配路径,找出所有目标文件 file_pattern = os.path.join(rootdir, "*.Ni*Nj*.txt") for old_path in glob.glob(file_pattern): filename = os.path.basename(old_path) # 分割得到前缀并生成新文件名 prefix = filename.rsplit(".Ni", 1)[0] new_filename = f"{prefix}.txt" new_path = os.path.join(rootdir, new_filename) os.rename(old_path, new_path)
内容的提问来源于stack exchange,提问作者Landon Gaber
相关产品推荐
相关产品推荐

