批量生成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
相关产品推荐
相关产品推荐

