使用try-except处理pymssql时,DataFrame仅拼接列表最后一项的问题
问题原因
你这段代码的核心问题是每次循环都会重新创建frames列表,覆盖之前存储的表数据,而且finally块在每轮循环都会执行,导致最终dfxilnex只保留了最后一次循环读取的表数据。
修正方案
- 先初始化一个空列表用来存储所有表的DataFrame
- 循环中成功读取表数据后,将其追加到列表中
- 循环结束后,一次性拼接所有表数据
修正后的代码:
# 初始化空列表存储所有表的DataFrame frames = [] for i in Com_Tables: try: # 读取表数据并添加标识列,追加到frames列表 df = pd.read_sql(f"SELECT * FROM {i}", conn).assign(ComId_Code = i) frames.append(df) except Exception as e: # 可选:打印读取失败的表名和错误信息,方便排查 print(f"读取表 {i} 失败: {str(e)}") pass # 循环结束后一次性拼接所有表数据 dfxilnex = pd.concat(frames, ignore_index=True)
额外说明
- 添加
ignore_index=True可以重置拼接后DataFrame的索引,避免索引重复 - 把
except:改成except Exception as e:,可以捕获并查看具体错误,方便排查读取失败的原因 - 不要在循环内的
finally块执行concat,否则每轮循环都会覆盖之前的拼接结果
内容的提问来源于stack exchange,提问作者ZulH
相关产品推荐
相关产品推荐

