import os import shutil from datetime import datetime, timedelta def print_sql_files(): """返回 Origin 目录下所有 sql 文件的内容字典 Returns: dict: 字典,key 是文件名,value 是文件内容 """ # 获取当前文件所在目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 构建 Origin 目录路径 origin_dir = os.path.join(current_dir, "Origin") # 创建结果字典 sql_files_dict = {} # 遍历 Origin 目录 for file_name in os.listdir(origin_dir): # 检查是否为 .sql 文件 if file_name.endswith(".sql"): # 构建完整路径 full_path = os.path.join(origin_dir, file_name) # 读取文件内容 try: with open(full_path, 'r', encoding='utf-8') as f: content = f.read() sql_files_dict[file_name] = content except Exception as e: print(f"读取文件 {file_name} 时出错: {e}") return sql_files_dict def get_month_data(month=None): """获取并返回指定月份或当前月份的相关数据 Args: month: 可选参数,格式为 YYYYMM (如 "202602"),如果不传则使用当前月份 返回格式: ["202602", "202603", "202601", "2026-02"] 分别对应:指定月份、次月、上月、指定月份(带分隔符) """ # 获取日期 if month: # 如果传入了月份,解析为日期 # 解析 YYYYMM 格式的月份 year = int(month[:4]) month_num = int(month[4:]) now = datetime(year, month_num, 1) else: # 如果没有传入月份,使用当前日期 now = datetime.now() # 当前月份 (格式: YYYYMM) current_month = now.strftime("%Y%m") # 次月 next_month = (now.replace(day=28) + timedelta(days=4)).strftime("%Y%m") # 上月 last_month = (now.replace(day=1) - timedelta(days=1)).strftime("%Y%m") # 当前月份 (带分隔符,格式: YYYY-MM) current_month_with_separator = now.strftime("%Y-%m") return [current_month, next_month, last_month, current_month_with_separator] def ensure_directory(directory_path): """判断指定目录是否存在,不存在则创建,存在则删除里面的内容 Args: directory_path: 要检查的目录路径 """ print(f"处理目录: {directory_path}") # 检查目录是否存在 if not os.path.exists(directory_path): # 目录不存在,创建目录 os.makedirs(directory_path) print(f"目录不存在,已创建: {directory_path}") else: # 目录存在,删除里面的内容 print(f"目录存在,删除里面的内容") for item in os.listdir(directory_path): item_path = os.path.join(directory_path, item) if os.path.isfile(item_path): os.remove(item_path) print(f"删除文件: {item_path}") elif os.path.isdir(item_path): shutil.rmtree(item_path) print(f"删除目录: {item_path}") def generate_sql_files(month=None): """生成SQL文件 Args: month: 可选参数,格式为 YYYYMM (如 "202602"),如果不传则使用当前月份 步骤: 1. 调用 ensure_directory 确保 SqlOut 目录存在且为空 2. 调用 get_month_data 读取参数列表 3. 调用 print_sql_files 获得文件键值对 4. 遍历步骤3的返回值,每条把结果按照步骤2的返回值进行string替换其中{0}{1}{2}{3}的值 5. 按照key值输出到步骤1所说的目录里 """ # 对传入的月份参数进行格式校验 if month: # 检查长度是否为6位 if len(month) != 6: raise ValueError(f"月份参数格式错误: {month},应为6位数字,格式为 YYYYMM") # 检查是否为数字 if not month.isdigit(): raise ValueError(f"月份参数格式错误: {month},应为数字") # 检查月份是否在有效范围内 (1-12) month_num = int(month[4:]) if month_num < 1 or month_num > 12: raise ValueError(f"月份参数格式错误: {month},月份应在 1-12 之间") # 步骤1: 确保 SqlOut 目录存在且为空 current_dir = os.path.dirname(os.path.abspath(__file__)) sql_out_dir = os.path.join(current_dir, "SqlOut") ensure_directory(sql_out_dir) # 步骤2: 读取参数列表 month_data = get_month_data(month) print(f"\n获取到的月份参数: {month_data}") # 步骤3: 获得文件键值对 sql_files = print_sql_files() print(f"\n获取到 {len(sql_files)} 个 SQL 文件") # 步骤4-5: 处理并输出文件 print("\n开始处理并输出文件:") for file_name, content in sql_files.items(): # 替换内容中的 {0}{1}{2}{3} try: # 使用 str.format 方法替换占位符 replaced_content = content.format(*month_data) # 构建输出文件路径 output_path = os.path.join(sql_out_dir, file_name) # 写入文件 with open(output_path, 'w', encoding='utf-8') as f: f.write(replaced_content) print(f"成功输出文件: {file_name}") except Exception as e: print(f"处理文件 {file_name} 时出错: {e}") import sys if __name__ == "__main__": # 检查命令行参数 if len(sys.argv) > 1: # 获取传入的月份参数 month = sys.argv[1] print(f"使用传入的月份参数: {month}") generate_sql_files(month) else: # 没有传入参数,使用当前月份 print("没有传入月份参数,使用当前月份") generate_sql_files()