17370845950

Python怎么把XML转换成DataFrame Pandas读取XML教程
Python中无稳定版pandas.read_xml()函数,需用xml.etree.ElementTree或lxml解析XML再构DataFrame;关键在于按XML树状结构提取属性与子元素,手动构建字典列表或借助lxml增强的read_xml()实验接口。

Python中没有pandas原生的read_xml()函数(截至pandas 2.0+仍属实验性,不推荐生产环境直接依赖),但可以通过标准库xml.etree.ElementTree或第三方库lxml解析XML,再构造DataFrame。关键在于理解XML结构,并将其映射为二维表格逻辑。

先看XML结构,再决定怎么转

XML不是表格格式,它可能是嵌套、属性混合、重复节点并存的树状结构。强行“一键转DataFrame”容易出错。例如:


  
    Python Crash Course
    Eric Matthes
    39.99
  
  
    Fluent Python
    Luciano Ramalho
    49.99
  

这个例子中:每本是1行;id是属性;是子元素;既有文本值又有currency属性——你需要明确哪些信息要进列。

用ElementTree手动解析(轻量、无需额外安装)

适合结构清晰、层级较浅的XML。步骤:加载 → 找到所有记录节点 → 提取字段 → 构建字典列表 → 转DataFrame。

  • 导入xml.etree.ElementTree as ETpandas
  • ET.parse("file.xml")ET.fromstring(xml_str)加载
  • root.findall(".//book")定位每一行数据节点(XPath支持有限,但够用)
  • 对每个book节点:
      – 用book.get("id")取属性
      – 用book.find("title").text取子元素文本
      – 用book.find("price").textbook.find("price").get("currency")分别取值和属性
  • 把每次提取的结果append进list,最后pd.DataFrame(list_of_dicts)

用lxml + pandas.read_xml(仅限pandas ≥ 1.4,需lxml支持)

如果你的XML是扁平的、每条记录同级且标签名一致(如上面的),可以尝试pandas内置实验接口:

  • 安装依赖:pip install lxmlxml.etree不支持XPath 2.0,lxml更强大)
  • 调用:pd.read_xml("books.xml", xpath=".//book")
  • 支持参数:attrs_only=True只读属性;names=["id", "title", "author"]重命名列;iterparse=True处理大文件(逐块解析)
  • 注意:read_xml()默认忽略属性,若要保留,得配合stylesheet(XSLT)或先用lxml预处理

处理常见坑点

空值/缺失子节点:用find()可能返回None,直接调.text会报错 → 改用find("xxx") is not None and find("xxx").text,或封装安全取值函数。
命名空间(ns):XML带xmlns="http://..."时,XPath必须声明前缀,例如root.findall(".//ns:book", namespaces={"ns": "http://..."})
大文件内存溢出:别用ET.parse()全量加载,改用ET.iterparse()边读边处理,或用lxml.etree.iterparse()events=("start", "end")流式解析。