Python提取XML数据映射MySQL表:Dataframe无法导入全量数据
问题分析与解决方案
1. 只导入一行/表头的核心原因
你倒数第二行代码里的index=0是致命错误:
df = pd.DataFrame(xmldf_dict["df_dicts"],index=0)
指定index=0会强制让pandas只生成一行数据(因为索引长度为1,和字典列表的实际长度不匹配,pandas会直接截断数据),直接去掉这个参数就能导入全部行。另外你已经处理好包含缺失列的final_df,完全没必要重新创建df,直接用final_df导入更合理。
2. 解决MySQL连接丢失(Error 2013)问题
这个错误通常是数据量过大,一次性导入超时导致连接断开,有两个直接解决方法:
- 分批次导入:在
to_sql中添加chunksize参数,控制每次写入的行数,比如每次导入1000行:final_df.to_sql(con=my_conn, name='postlinks', if_exists='append', index=False, chunksize=1000) - 延长连接超时时间:创建引擎时添加连接参数,拉高超时阈值:
若仍出现问题,可检查MySQL服务器的my_conn = create_engine( "mysql+mysqldb://sqluser:password@localhost/stackexchange_project", connect_args={'connect_timeout': 120} # 设置为120秒,可根据数据量调整 )wait_timeout和interactive_timeout配置,适当调大这两个参数的值(需修改my.cnf/my.ini后重启服务)。
3. 修复代码中的其他潜在问题
missing_col类型错误:你定义missing_col = [](列表),但用了missing_col.add(k)——列表没有add方法,会触发报错。改成集合来避免重复列名:missing_col = set() # 改为集合 ... missing_col.add(k) # 集合支持add方法- 使用处理好的
final_df导入:你已经合并了缺失列的final_df,但最后没用到,直接用它导入才能保证所有列都写入数据库。
修正后的关键代码片段
# 修复missing_col的类型 missing_col = set() xmldf_dict = {"df_dicts":[]} for elem in root: df_dict = {} for k,v in mapping_dict.items(): if k in ['Body']: continue try: df_dict[k] = elem.attrib[v] except KeyError: missing_col.add(k) xmldf_dict["df_dicts"].append(df_dict) # 合并缺失列(集合转列表) missing_col_df = pd.DataFrame(columns=list(missing_col)) xml_df = pd.DataFrame(xmldf_dict["df_dicts"]) final_df = pd.concat([xml_df, missing_col_df], axis=1) # 创建引擎并分批次导入 my_conn = create_engine( "mysql+mysqldb://sqluser:password@localhost/stackexchange_project", connect_args={'connect_timeout': 120} ) final_df.to_sql(con=my_conn, name='postlinks', if_exists='append', index=False, chunksize=1000)
内容的提问来源于stack exchange,提问作者Marcus Pacheco
相关产品推荐
相关产品推荐

