如何改进Python脚本实现文件名的智能拆分与信息提取?
解决可变结构文件名的信息提取问题
这个问题我碰到过类似的,核心就是要不依赖固定数量的下划线,而是从文件名的末尾反向提取数字部分,前面的内容统一作为前缀。给你两种实用的解决方案:
方法一:基于列表拆分的反向提取
这种方法简单直观,先处理掉文件后缀,再拆分所有下划线部分,然后从列表末尾取最后两个数字元素,前面的元素拼接成前缀:
import os for file in os.listdir("C:\\alt\\her"): if not file: continue # 去掉文件后缀(比如.txt),用os.path.splitext比手动split更可靠 filename_no_ext = os.path.splitext(file)[0] # 把文件名按下划线拆分成列表 parts = filename_no_ext.split("_") # 确保文件名格式符合要求(至少有前缀+两个数字) if len(parts) >= 3: # 倒数第二个元素是JinkinsBuild,最后一个是TestJob JinkinsBuild = parts[-2] TestJob = parts[-1] # 前面所有元素用下划线拼接成Namearray Namearray = "_".join(parts[:-2]) # 验证输出 print(f">>>Namearray = {Namearray}") print(f">>>JinkinsBuild = {JinkinsBuild}") print(f">>>TestJob = {TestJob}") else: # 跳过格式不符合的文件,避免报错 print(f"跳过格式无效的文件: {file}")
方法二:正则表达式匹配(更严谨)
如果需要确保最后两个部分一定是数字,用正则表达式会更靠谱,能精准匹配符合规则的文件名,自动过滤不符合的:
import os import re # 正则规则:匹配前缀(任意字符直到最后两个下划线数字)+ 两个数字组 + 可选的.txt后缀 filename_pattern = re.compile(r'^(.*)_(\d+)_(\d+)(?:\.txt)?$') for file in os.listdir("C:\\alt\\her"): if not file: continue # 匹配文件名 match_result = filename_pattern.match(file) if match_result: # 提取分组内容 Namearray = match_result.group(1) JinkinsBuild = match_result.group(2) TestJob = match_result.group(3) # 验证输出 print(f">>>Namearray = {Namearray}") print(f">>>JinkinsBuild = {JinkinsBuild}") print(f">>>TestJob = {TestJob}") else: print(f"跳过格式无效的文件: {file}")
两种方法的对比
- 方法一适合文件名格式比较规范的场景,代码易读易维护;
- 方法二更严谨,能确保最后两个部分是数字,避免非数字内容被误提取,适合对数据准确性要求高的场景。
内容的提问来源于stack exchange,提问作者user11412912
相关产品推荐
相关产品推荐

