pandas 官方从未实现 read_xml 函数,因其xml结构复杂、缺乏天然二维映射;推荐用 xml.etree.elementtree 解析后转为字典列表,再创建 dataframe。

Pandas 没有 read_xml 函数,直接调用会报 AttributeError: module 'pandas' has no attribute 'read_xml'
为什么你搜不到 read_xml?
Pandas 官方从未实现过 read_xml —— 这个函数根本不存在。网上所谓“教程”要么是混淆了旧版第三方库(如 xmltodict + pandas.DataFrame 手动转换),要么是误把 read_html 或 read_json 的写法套用过来。
XML 结构灵活、嵌套深、属性与文本混杂,不像 CSV 或 JSON 那样有天然的二维映射关系,Pandas 团队明确表示暂不支持原生 XML 解析。
替代方案:用 xml.etree.ElementTree + pandas.DataFrame 构建数据
这是目前最轻量、兼容性最好、可控性最强的做法。别绕开标准库去装新包,除非你真需要处理带命名空间或 XSLT 的复杂 XML。
立即学习“Python免费学习笔记(深入)”;
本文档主要讲述的是使用JSON进行网络数据交换传输;JSON(JavaScript ObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,非常适合于服务器与客户端的交互。JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON的数据格式非常简单,您可以用 JSON 传输一个简单的 St
- 先用
xml.etree.ElementTree.parse()或ET.fromstring()加载 XML - 手动提取目标节点(比如所有
<record></record>),逐个转成字典 - 用这些字典列表初始化
pandas.DataFrame
示例(假设 XML 是扁平记录集):
import xml.etree.ElementTree as ET
import pandas as pd
<p>tree = ET.parse("data.xml")
root = tree.getroot()</p><p>records = []
for item in root.findall("item"): # 替换为你的实际节点名
records.append({
"name": item.find("name").text if item.find("name") is not None else None,
"price": float(item.find("price").text) if item.find("price") is not None else None,
"in_stock": item.get("available") == "true" # 读取属性
})</p><p>df = pd.DataFrame(records)哪些情况会踩坑?
XML 解析不是“读一行 CSV”那么简单,几个高频翻车点:
- 节点名大小写敏感:
item和Item是不同节点,find()不会自动忽略 - 空节点或缺失字段导致
None.text报AttributeError,必须加if ... is not None判断 - 文本中含换行/缩进空白,
.text.strip()得自己补上 - 属性值是字符串,数字或布尔需手动转换,Pandas 不会自动推断
- 嵌套多层(比如
<order><items><item>...</item></items></order>)时,别试图一层findall搞定,得先定位父节点再循环子节点
要不要用第三方库?
像 lxml 或 xmltodict 确实能简化部分操作,但代价明显:
-
lxml编译依赖多,Windows 上pip install lxml经常失败;它支持 XPath,但多数简单 XML 用不上 -
xmltodict把整个 XML 变成嵌套字典,内存占用大,且遇到重复标签名(如多个<tag>val</tag>)会自动转成列表,结构不可控 - 一旦用了这些库,你就得长期维护额外依赖,而标准库
ElementTree已内置、稳定、够用
真正卡住的往往不是解析能力,而是对 XML 数据结构的理解偏差——先用 print(ET.tostring(root, encoding='unicode')) 看清真实结构,比急着找“一键导入”靠谱得多。









