Python如何基于YAML配置的文件名规则动态填充多文本变量
解决方案
核心思路
不用正则手动识别年、月的插入位置,直接将配置文件中的自定义占位符(YYYY、MM)转换为Python内置的strftime格式标识,复用Python原生的时间格式化能力,天然支持任意前后缀、年月位置互换、中间插入自定义字符的所有场景,后续新增时间单位(如日、小时)仅需新增占位符映射规则即可,完全满足未来适用性要求。
前置依赖
安装所需第三方库:
pip install pyyaml python-dateutil
如果不想额外安装python-dateutil,可自行实现月份递增逻辑。
完整代码实现
import yaml from datetime import datetime from dateutil.relativedelta import relativedelta def load_config(config_path: str = "config.yml") -> str: """加载yml配置,返回文件名规则""" with open(config_path, "r", encoding="utf-8") as f: config = yaml.safe_load(f) return config["log_name_scheme"] def scheme_convert(custom_scheme: str) -> str: """自定义占位符转换为strftime格式规则""" format_str = custom_scheme.replace("YYYY", "%Y") format_str = format_str.replace("MM", "%m") # 后续需新增其他时间单位,仅需在此添加对应替换规则即可,例如: # format_str = format_str.replace("DD", "%d") # 支持2位日期 # 极低成本实现英文月份支持,按需开启: # format_str = format_str.replace("MMM", "%b") # 短英文月份,如Jan、May # format_str = format_str.replace("MMMM", "%B") # 长英文月份,如January、May return format_str def get_single_filename(year: int, month: int, format_str: str) -> str: """根据指定年月生成对应文件名""" dt = datetime(year=year, month=month, day=1) return dt.strftime(format_str) def get_batch_filenames(start_dt: datetime, end_dt: datetime, format_str: str) -> list[str]: """根据起止时间批量生成对应时段所有月份的文件名""" filenames = [] current = start_dt.replace(day=1) end = end_dt.replace(day=1) while current <= end: filenames.append(current.strftime(format_str)) current += relativedelta(months=1) return filenames # 调用示例 if __name__ == "__main__": custom_scheme = load_config() format_rule = scheme_convert(custom_scheme) # 测试单文件生成 print(get_single_filename(2024, 5, format_rule)) # 你的示例配置输出为:stat202405.log # 测试批量生成2023年全年12个文件名 start = datetime(2023, 1, 1) end = datetime(2023, 12, 31) all_files = get_batch_filenames(start, end, format_rule) print(len(all_files)) # 输出12
适配验证
任意修改config.yml中的文件名规则,无需修改业务代码即可生效:
- 规则改为
log_name_scheme: MM-YYYY_audit.csv,生成结果为05-2024_audit.csv - 规则改为
log_name_scheme: report_YYYY.MM.backup,生成结果为report_2024.05.backup
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

