You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:15:10