使用Python pandas将.xml转.xlsx时报BadZipFile错误该如何解决
问题原因
直接修改后缀名把XML改为xlsx的操作仅修改了文件名标识,没有转换文件本质格式。xlsx是基于ZIP压缩的结构化格式,而你生成的file.xlsx本质还是纯XML文本,因此pandas调用openpyxl读取时会抛出BadZipFile错误。你手动用Excel打开再保存时,Excel会自动将兼容的XML表格格式转换为标准xlsx格式,因此可以被pandas正常读取。
可行解决方案
- 方案1:直接解析XML生成DataFrame(无需转Excel,效率最高)
Pandas 1.3.0及以上版本内置read_xml函数,对Excel可直接打开的SpreadsheetML格式XML兼容性很好,可直接读取:
import pandas as pd # 基础用法,大多数场景可直接生效 df = pd.read_xml("file.xml") # 若默认读取不到对应表格,可调整xpath参数指定数据节点路径,例: # df = pd.read_xml("file.xml", xpath=".//row")
如果read_xml无法适配你的XML结构,可借助xmltodict库先将XML转为字典结构,再加工为DataFrame,首先安装依赖:pip install xmltodict,参考代码:
import xmltodict import pandas as pd with open("file.xml", "r", encoding="utf-8") as f: xml_dict = xmltodict.parse(f.read()) # 按XML实际层级提取表格数据,示例为根节点下的row节点集合 table_data = xml_dict["根节点名"]["row节点名"] df = pd.DataFrame(table_data)
- 方案2:自动完成Excel格式转换(无需手动打开保存)
Windows环境可调用win32com模拟Excel操作完成转换,首先安装依赖:pip install pywin32,参考代码:
import win32com.client as win32 import pandas as pd # 路径需使用绝对路径 xml_path = r"C:\xxx\file.xml" xlsx_path = r"C:\xxx\file.xlsx" excel = win32.gencache.EnsureDispatch('Excel.Application') wb = excel.Workbooks.Open(xml_path) wb.SaveAs(xlsx_path, FileFormat=51) wb.Close() excel.Quit() df = pd.read_excel(xlsx_path, engine="openpyxl")
跨平台环境可调用LibreOffice命令行完成转换,参考代码:
import subprocess import pandas as pd subprocess.run(["libreoffice", "--headless", "--convert-to", "xlsx", "file.xml"]) df = pd.read_excel("file.xlsx", engine="openpyxl")
内容的提问来源于stack exchange,提问作者Mirko
相关产品推荐
相关产品推荐

