Python实现SQL文件日期动态替换及用户强制输入校验需求
解决方案
1. 日期输入强制校验
先实现一个循环校验的函数,确保用户必须输入MM/DD/YYYY格式的日期才能继续:
from datetime import datetime def get_valid_report_date(): while True: date_input = input("请输入报告日期(格式:MM/DD/YYYY):").strip() try: # 验证格式并转成标准字符串 report_date = datetime.strptime(date_input, "%m/%d/%Y") return report_date.strftime("%m/%d/%Y") except ValueError: print("格式不对!必须是MM/DD/YYYY,比如'10/31/2022',重新输!")
2. SQL文件日期精准替换
用正则表达式匹配SQL中所有'MM/DD/YYYY'格式的日期字符串,不管原日期是什么,都能替换成用户输入的合法日期:
import re def replace_sql_date(sql_file_path, target_date): # 读取原始SQL内容 with open(sql_file_path, 'r', encoding='utf-8') as f: sql_content = f.read() # 正则匹配单引号包裹的MM/DD/YYYY格式日期 date_pattern = r"'(\d{1,2}/\d{1,2}/\d{4})'" # 替换成目标日期,保留单引号 updated_sql = re.sub(date_pattern, f"'{target_date}'", sql_content) # 可选:要么覆盖原SQL文件,要么生成新文件(推荐生成新文件避免误改原脚本) # with open(sql_file_path, 'w', encoding='utf-8') as f: # f.write(updated_sql) return updated_sql
3. 完整整合代码(含SQL执行与CSV导出)
结合数据库执行和CSV导出的完整流程(以SQLAlchemy+pandas为例,根据你的数据库类型调整连接字符串):
from datetime import datetime import re import pandas as pd from sqlalchemy import create_engine def get_valid_report_date(): while True: date_input = input("请输入报告日期(格式:MM/DD/YYYY):").strip() try: report_date = datetime.strptime(date_input, "%m/%d/%Y") return report_date.strftime("%m/%d/%Y") except ValueError: print("格式不对!必须是MM/DD/YYYY,比如'10/31/2022',重新输!") def replace_sql_date(sql_file_path, target_date): with open(sql_file_path, 'r', encoding='utf-8') as f: sql_content = f.read() date_pattern = r"'(\d{1,2}/\d{1,2}/\d{4})'" updated_sql = re.sub(date_pattern, f"'{target_date}'", sql_content) return updated_sql def execute_sql_to_csv(updated_sql, db_conn_str, csv_path): # 创建数据库连接(替换成你的数据库信息) engine = create_engine(db_conn_str) # 执行SQL并获取数据 df = pd.read_sql(updated_sql, engine) # 导出CSV df.to_csv(csv_path, index=False, encoding='utf-8-sig') print(f"搞定!CSV文件已生成:{csv_path}") if __name__ == "__main__": # 步骤1:拿到合法日期 target_date = get_valid_report_date() # 步骤2:替换SQL里的日期 sql_path = "myreport.sql" updated_sql = replace_sql_date(sql_path, target_date) # 步骤3:执行SQL并导出CSV(替换成你的数据库连接字符串) db_conn = "mysql+pymysql://用户名:密码@主机:端口/数据库名" csv_output = f"月度报告_{target_date.replace('/', '_')}.csv" execute_sql_to_csv(updated_sql, db_conn, csv_output)
关键提示
- 正则表达式会匹配所有符合
'MM/DD/YYYY'格式的日期,不管SQL里原来写的是哪天,都能精准替换 - 日期校验会循环提示,直到用户输入正确格式为止,完全强制校验
- 建议把替换后的SQL保存为新文件,避免误修改原始的SQL脚本
- 数据库连接字符串要根据你用的数据库(MySQL、SQL Server、PostgreSQL等)调整格式
内容的提问来源于stack exchange,提问作者bananas
相关产品推荐
相关产品推荐

