Python实现字典自定义映射自动化:解决Annual文件匹配问题
自动化生成文件-日期映射字典
问题背景
当前手动维护文件与日期的映射字典,随着文件数量增加,手动维护效率极低。映射规则如下:
- 月度文件:取
Auc紧邻前方的日期作为基准日期,日固定为1 - Annual文件:年份取
Annual后的数字,月份固定为1,日期取文件名中的Round编号
原代码仅能处理月度文件,无法匹配Annual文件,原因是正则表达式_(\w{3}\d{2})Auc_仅匹配"三个字母+两位数字+Auc"的格式,而Annual文件的格式是Annual21Auc,不符合该正则规则。
解决方案
修改正则表达式,使其同时匹配月度文件和Annual文件的日期标识,再根据文件类型分别处理日期生成逻辑:
完整代码
import os import re from datetime import datetime path = "你的文件路径" # 替换为实际文件夹路径 folder_list = [x for x in os.listdir(path) if 'MarketResults' in x] mapping = {} # 正则匹配两种格式:月度(如Dec21)和Annual(如Annual21) pattern = r'_(Annual\d{2}|\w{3}\d{2})Auc_' for filename in folder_list: match = re.search(pattern, filename) if not match: print(f"无法匹配文件:{filename}") continue date_segment = match.group(1) # 处理Annual文件 if date_segment.startswith('Annual'): # 提取年份:取Annual后的两位数字,转为完整年份 year = 2000 + int(date_segment[6:]) month = 1 # 提取Round编号作为日期 round_match = re.search(r'Round_(\d)', filename) day = int(round_match.group(1)) if round_match else 1 # 处理月度文件 else: # 解析月份和年份,日固定为1 date_obj = datetime.strptime(date_segment, '%b%y') year = date_obj.year month = date_obj.month day = 1 mapping[filename] = datetime(year, month, day) # 打印测试结果 for file, date in mapping.items(): print(f"{file}: {date}")
代码说明
- 正则表达式优化:
_(Annual\d{2}|\w{3}\d{2})Auc_使用分支匹配,同时捕获Annual+两位数字和三个字母+两位数字两种格式 - Annual文件处理:从捕获的
Annual21中提取年份转为完整年份,月份固定为1,通过额外正则提取Round编号作为日期 - 月度文件处理:保持原有逻辑,解析
Dec21为对应年月,日固定为1 - 异常处理:增加匹配失败提示,避免程序中断
内容的提问来源于stack exchange,提问作者ARE
相关产品推荐
相关产品推荐

