如何用Python提取文件名#后数字并移至开头实现文件重命名
解决视频文件重命名的数字提取问题
嘿,我明白你现在的困扰——split()函数确实不太适合精准提取这种「# + 数字」的子串,用正则表达式会是更靠谱的方案!下面我一步步给你讲清楚怎么实现:
核心思路:用正则捕获#后的数字
正则可以精准定位文件名中#后面的连续数字,不管前后有什么内容,都能把数字单独揪出来。我们用Python的re模块来实现这个功能。
完整代码示例
假设你的原文件名格式是类似这样:
Crash Course Computer Science #27 - 计算机网络基础-TEAtmCYYKZA.en.mp4
目标是改成:
27 - 计算机网络基础.mp4
下面是可以直接用的代码(记得替换成你的视频文件夹路径):
import os import re # 替换成你的视频所在文件夹路径 video_folder = "/Users/you/videos/crash_course" # 正则模式:匹配#后面的一串数字,括号里的是要捕获的数字部分 num_pattern = r'#(\d+)' # 如果后面的"-TEAtmCYYKZA.en"是可变的(比如每个文件的ID不同),可以用这个正则来匹配删除 suffix_pattern = r'-[A-Za-z0-9]+\.en' for file_name in os.listdir(video_folder): file_path = os.path.join(video_folder, file_name) # 只处理文件,跳过文件夹 if not os.path.isfile(file_path): continue # 提取#后面的数字 match_result = re.search(num_pattern, file_name) if not match_result: print(f"跳过无编号的文件:{file_name}") continue lesson_num = match_result.group(1) # 第一步:删除开头的固定前缀 temp_name = file_name.replace("Crash Course Computer Science #", "") # 第二步:删除末尾的固定/可变后缀 temp_name = re.sub(suffix_pattern, "", temp_name) # 第三步:把数字移到文件名开头 final_name = f"{lesson_num} {temp_name}".strip() # strip去掉多余的空格 # 执行重命名(测试阶段可以先注释掉这两行,看final_name是否符合预期) old_full_path = os.path.join(video_folder, file_name) new_full_path = os.path.join(video_folder, final_name) os.rename(old_full_path, new_full_path) print(f"已重命名:{file_name} → {final_name}")
关键部分解释
- 正则捕获数字:
r'#(\d+)'的意思是:#:匹配字符#(\d+):捕获一个或多个数字(\d代表数字,+表示至少一个),括号是捕获组,方便我们取出数字内容
- 处理可变后缀:如果每个文件末尾的
-TEAtmCYYKZA.en里的ID不一样,用re.sub(suffix_pattern, "", temp_name)可以批量删除所有类似格式的后缀,不用一个个写replace - 为什么不用split?:
split()是按固定分隔符拆分字符串,比如用#拆分后,你得到的第二部分开头是数字,但后面跟着空格、标题等内容,还要再拆分一次才能拿到纯数字,步骤繁琐且容易出错,正则一步到位更高效
小提示
测试的时候可以先把os.rename那两行注释掉,只打印final_name,确认所有文件名都符合你的预期后再执行重命名操作,避免误改文件~
内容的提问来源于stack exchange,提问作者Özenç B.
相关产品推荐
相关产品推荐

