Pandas参数化表名实现动态查询及导出文件报错解决
问题解决与修正代码
错误原因分析
- Unicode转义错误:Windows路径中的
\是Python转义字符,\Users会被识别为\U开头的Unicode转义序列,但后续字符不完整,导致解码失败。 - 字符串拼接语法错误:
filepath="C:\Users\imbea\Desktop\test"+{param}+".txt"里的{param}写法不合法,不是正确的字符串拼接方式。 - 变量覆盖问题:循环中用读取的表数据覆盖了存储表名的
df,会导致后续循环迭代异常。
修正后的代码
# 把存储表名的DataFrame重命名为table_names_df,避免和表数据变量冲突 for index, row in table_names_df.iterrows(): table_name = row["table_name"] # 拼接查询语句(注:表名无法用参数绑定,需确保table_name来源可信,避免SQL注入) query = f"select * from Person.{table_name}" # 用新变量存储当前表的数据,不覆盖原表名列表 table_df = pd.read_sql(query, cnxn) # 处理路径:用原始字符串r""跳过转义解析,或把\换成/ filepath = rf"C:\Users\imbea\Desktop\test\{table_name}.txt" # 导出为txt,若不需要追加内容可将mode改为'w' table_df.to_csv(filepath, index=None, sep='|', mode='a')
关键修改点
- 路径处理:在路径字符串前加
r(原始字符串),让Python不解析转义字符;或者将\替换为/,两种方式都能解决Unicode转义问题。 - 变量名区分:将存储表数据的变量改为
table_df,避免覆盖存储表名的原始DataFrame。 - 字符串拼接:用f-string统一构建查询语句和文件路径,语法更简洁正确。
- 安全提醒:由于表名无法通过参数化查询绑定,直接拼接表名需确保
table_name是从系统表等可信渠道获取的,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者seriouslyimanoob
相关产品推荐
相关产品推荐

