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

批量生成datetime命名文件时,循环递增template.substitute变量的问题

批量生成带Datetime命名的模板文件:Python实现指南

嘿,我完全理解你要批量生成数百个基于特定datetime命名、复用同一模板文件的需求——核心思路用string.Template是完全没问题的,我帮你把整个流程捋顺,顺便修正代码里的小问题,再给你完整的实现方案:

先搞定模板读取的变量命名问题

你自己也提到了,FileTemplate既指代文件对象又指代模板实例是不良习惯,很容易引发逻辑混乱,先把这部分改得清晰一点:

from string import Template
from datetime import datetime

# 读取模板文件,用不同变量区分文件对象和模板内容
with open("你的模板文件路径.txt", "r", encoding="utf-8") as template_file:
    raw_template = template_file.read()
# 创建模板实例
file_template = Template(raw_template)

生成符合要求的Datetime文件名

要生成带特定datetime的文件名,你可以用datetime.strftime()自定义格式——比如你要按“年月日_时分秒”命名,就可以这么写:

# 生成当前时间的文件名示例
current_time = datetime.now()
file_name = current_time.strftime("%Y-%m-%d_%H-%M-%S_自定义后缀.txt")

# 如果要生成一系列连续时间点的文件名(比如每隔1小时的历史时间),可以用timedelta来递推:
from datetime import timedelta

# 起始时间
start_dt = datetime(2024, 1, 1, 0, 0, 0)
# 要生成的文件数量
total_files = 100

for i in range(total_files):
    # 计算当前文件对应的时间
    target_dt = start_dt + timedelta(hours=i)
    # 生成文件名
    file_name = target_dt.strftime("%Y-%m-%d_%H-%M-%S_report.txt")

替换模板内容并写入文件

假设你的模板里有类似${report_date}、${file_number}这样的占位符,就可以用substitute()(或safe_substitute())替换内容,然后写入新文件:

# 准备替换的上下文数据
context = {
    "report_date": target_dt.strftime("%Y年%m月%d日"),
    "file_number": i + 1,
    "total_count": total_files
}

# 替换模板内容
# 用safe_substitute的话,即使模板有缺失的占位符也不会报错,会保留原占位符
final_content = file_template.safe_substitute(context)

# 写入新文件
with open(file_name, "w", encoding="utf-8") as new_file:
    new_file.write(final_content)

完整的批量生成脚本示例

把上面的步骤整合起来,就是可以直接运行的完整代码:

from string import Template
from datetime import datetime, timedelta
import os

def generate_batch_template_files(template_path, start_datetime, file_count, interval_hours=1, output_dir="./generated_files"):
    # 创建输出目录(如果不存在)
    os.makedirs(output_dir, exist_ok=True)

    # 读取模板文件
    try:
        with open(template_path, "r", encoding="utf-8") as template_file:
            raw_template = template_file.read()
    except FileNotFoundError:
        print(f"错误:找不到模板文件 {template_path}")
        return
    
    file_template = Template(raw_template)

    # 批量生成文件
    for i in range(file_count):
        # 计算当前文件对应的时间
        target_dt = start_datetime + timedelta(hours=i * interval_hours)
        # 生成文件名(加上输出目录路径)
        file_name = os.path.join(output_dir, target_dt.strftime("%Y-%m-%d_%H-%M-%S_report.txt"))
        # 准备替换上下文
        context = {
            "report_datetime": target_dt.strftime("%Y-%m-%d %H:%M:%S"),
            "file_index": i + 1,
            "total_files": file_count,
            "interval": interval_hours
        }

        # 替换模板内容
        try:
            final_content = file_template.substitute(context)
        except KeyError as e:
            print(f"警告:模板中缺少占位符 {e},跳过文件 {file_name}")
            continue

        # 写入文件
        with open(file_name, "w", encoding="utf-8") as new_file:
            new_file.write(final_content)
        print(f"已成功生成:{file_name}")

# 使用示例
if __name__ == "__main__":
    # 起始时间:2024年5月1日0点
    start_time = datetime(2024, 5, 1, 0, 0, 0)
    # 生成100个文件,每隔2小时一个时间点
    generate_batch_template_files("template.txt", start_time, 100, interval_hours=2)

几个实用小技巧

  • 占位符容错:如果不确定模板里的占位符是否都能被替换,用safe_substitute()代替substitute(),避免因缺失占位符导致脚本中断
  • 目录管理:建议把生成的文件放到单独的目录下,避免和其他文件混在一起,代码里已经加了创建输出目录的逻辑
  • 时间格式自定义:strftime()的格式可以灵活调整,比如用%Y%m%d生成紧凑的日期字符串,或者加%A显示星期几

内容的提问来源于stack exchange,提问作者arsenal88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:18:45