如何修改Python循环代码避免CSV文件被覆盖并导出多表数据
解决SQL Server表批量导出CSV的问题
问题分析
- 仅导出最后一个表:原代码中数据帧创建和CSV导出语句在
for循环外部,循环仅更新sql_query变量,最终只处理最后一次循环的表数据。 - pandas警告:使用pyodbc直接连接不符合pandas推荐的连接方式,建议改用SQLAlchemy连接。
修改后的代码
import pandas as pd from sqlalchemy import create_engine # 使用SQLAlchemy创建连接引擎,消除pandas警告 conn_str = 'mssql+pyodbc://server/db?driver=ODBC+Driver+17+for+SQL+Server&Trusted_Connection=yes' engine = create_engine(conn_str) # 可选:自动获取数据库所有基表,替代手动指定tables列表 # select_all_tables_query = pd.read_sql_query("SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE'", engine) # tables = select_all_tables_query['table_name'].tolist() tables = ['table1', 'table2'] export_path = r'C:\path\to\exported\file\location\{}.csv' for table in tables: # 查询当前表数据 df = pd.read_sql_query(f"SELECT * FROM {table}", engine) # 导出为独立CSV文件 df.to_csv(export_path.format(table), index=False)
关键修改点
- 修正循环逻辑:将数据查询、数据帧创建和CSV导出操作全部移入
for循环内部,确保每个表都能被单独处理并导出。 - 替换连接方式:改用SQLAlchemy的
create_engine创建连接,完全符合pandas的要求,消除警告信息。 - 优化路径生成:使用字符串格式化动态生成每个表的导出路径,避免硬编码错误。
- 可选批量优化:注释部分提供了自动获取数据库所有基表的代码,无需手动维护
tables列表,适合批量导出场景。
内容的提问来源于stack exchange,提问作者testmythoughts
相关产品推荐
相关产品推荐

