Python中如何在FOR循环内用IF判断SQL行条件并导出指定列到CSV
按品牌拆分保存CSV文件的修正方案
原代码存在的问题
- 每次循环都执行全表查询,数据库访问次数过多,效率极低
- 遍历
QUERY的方式错误:for row in QUERY实际是遍历列名,而非数据行 - 品牌匹配逻辑错误:
str(QUERY["BRAND"])==str(i)是将整个BRAND列转为字符串与当前品牌比较,而非逐行判断 - 行数据取值错误:
row[A,B]的写法不符合Python语法,无法正确获取A、B列的值
推荐解决方案(高效简洁版)
利用Pandas的分组功能和内置CSV写入方法,一次性查询数据后按品牌拆分保存,大幅提升效率:
import pyodbc import pandas as pd # 数据库连接(需提前定义server/database/username/password变量) cnxn = pyodbc.connect(f'DRIVER={{SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}') # 一次性查询所有需要的数据 all_data = pd.read_sql_query(""" SELECT A, B, BRAND FROM DATABASE """, cnxn) # 定义文件保存路径(末尾加斜杠避免路径拼接错误) ROUT = "my rout/" # 按品牌分组并保存CSV for brand, group in all_data.groupby('BRAND'): # 构造目标文件名 file_name = f"{ROUT}NAME{brand}.csv" # 仅保留A、B列,保存为CSV(分隔符为;,不保存索引) group[['A', 'B']].to_csv(file_name, sep=';', index=False)
关键改进点
- 减少数据库交互:仅执行1次全量查询,避免循环内重复访问数据库
- 自动分组筛选:通过
groupby('BRAND')直接按品牌拆分数据,无需手动判断 - 简化写入逻辑:用Pandas的
to_csv方法直接处理列选择、分隔符、索引等需求,代码更简洁易维护 - 路径优化:用f-string拼接路径,且路径末尾加斜杠,避免出现
folderNAME品牌.csv这类错误路径
手动遍历写入的修正版(兼容原代码思路)
如果坚持用手动遍历的方式写入,可参考以下修正后的代码:
import pyodbc import csv import pandas as pd cnxn = pyodbc.connect(f'DRIVER={{SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}') # 获取所有不重复的品牌(比GROUP BY更高效) brands = pd.read_sql_query(""" SELECT DISTINCT BRAND FROM DATABASE """, cnxn)['BRAND'].tolist() # 一次性查询全量数据 all_data = pd.read_sql_query(""" SELECT A, B, BRAND FROM DATABASE """, cnxn) ROUT = "my rout/" for brand in brands: file_name = f"{ROUT}NAME{brand}.csv" # 筛选当前品牌的数据 filtered_rows = all_data[all_data['BRAND'] == brand] with open(file_name, "w", newline='', encoding='utf-8') as f: wrtr = csv.writer(f, delimiter=';') # 写入表头(按需选择) wrtr.writerow(['A', 'B']) # 遍历筛选后的每行数据 for _, row in filtered_rows.iterrows(): wrtr.writerow([row['A'], row['B']])
内容的提问来源于stack exchange,提问作者user22226238
相关产品推荐
相关产品推荐

