如何将Python循环SQL查询的所有结果保存为单个表格文件
循环SQL查询结果汇总写入单文件实现方法
问题原因
现有代码存在两处核心逻辑错误,导致最终输出仅保留最后一次查询结果:
pd.concat()为非原地操作,执行后会返回拼接完成的新DataFrame,不会修改传入的原始对象。原代码仅调用concat未接收返回值,每次查询得到的temp_df实际没有存入初始化的结果集df中,df始终为空。- 若将
to_csv放在循环内,pandas默认写入模式为覆盖写(mode='w'),每次执行都会清空文件原有内容写入当前结果,循环结束后自然只剩最后一次的查询数据。
可直接复用的修复方案
方案1:内存拼接后一次性导出(适合总数据量较小的场景)
逻辑最简单,仅需修正concat的赋值逻辑即可,修改后的核心代码如下:
# 初始化固定列名的空结果集 df = pd.DataFrame([], columns=['a','b','c','d','e']) for row in range(3, sheet.max_row + 1): a0, b0, r = sheet.cell(row,1).value, sheet.cell(row,2).value, 0.001 query = """ SELECT a,b,c,d,e FROM smthng WHERE q3c_radial_query(a,b,{:f},{:f},{:f}) LIMIT 1 """.format(a0,b0,r) response = qc.query(sql=query, format='csv') temp_df = convert(response, 'pandas') # 关键:接收concat返回的拼接结果,重置索引避免索引重复 df = pd.concat([df, temp_df], ignore_index=True) # 所有循环执行完成后一次性导出文件 df.to_csv('trial.csv', index=False)
参数说明:
ignore_index=True:拼接后重新生成连续行索引,避免多段数据索引重复index=False:导出时不写入pandas自动生成的行索引列,保持输出文件整洁
方案2:循环追加写入(适合总数据量较大的场景)
如果查询结果总数据量较高,全量加载到内存容易造成资源占用过高,可以改为边查边写的模式:第一次写入时创建文件、写入列名和第一份数据,后续循环仅追加数据内容、不重复写列名。
# 标记是否为首次写入 is_first_write = True for row in range(3, sheet.max_row + 1): a0, b0, r = sheet.cell(row,1).value, sheet.cell(row,2).value, 0.001 query = """ SELECT a,b,c,d,e FROM smthng WHERE q3c_radial_query(a,b,{:f},{:f},{:f}) LIMIT 1 """.format(a0,b0,r) response = qc.query(sql=query, format='csv') temp_df = convert(response, 'pandas') if is_first_write: # 首次写入:覆盖模式,写入列名 temp_df.to_csv('trial.csv', mode='w', index=False, header=True) is_first_write = False else: # 后续写入:追加模式,不写列名 temp_df.to_csv('trial.csv', mode='a', index=False, header=False)
核心写入参数说明:
mode='w':覆盖写入模式,首次执行时清空目标文件原有内容mode='a':追加写入模式,后续执行时将新内容写到文件末尾,不修改已有内容header=False:追加写入时跳过列名行,保证最终文件仅在开头存在一行统一列名
内容的提问来源于stack exchange,提问作者James Lane
相关产品推荐
相关产品推荐

