pandas 没有 read_xml() 函数,需用 xml.etree.elementtree 或 lxml 解析 xml 成字典列表,再传给 pd.dataframe;含属性或嵌套时推荐 lxml + xpath,并注意编码、引号和缺失字段处理。

用 pandas.read_xml() 直接读 XML?别试了,它不存在
截至 pandas 2.2(2024 年中),pandas 官方**没有 read_xml() 函数**。网上搜到的所谓“一行代码”方案,要么是误传,要么依赖未公开的内部函数或第三方补丁,实际运行会报 AttributeError: module 'pandas' has no attribute 'read_xml'。
真正能稳定用的,是 pandas.read_xml() 的替代路径:先用标准库或 lxml 解析 XML 成结构化数据(如 list of dict),再喂给 pd.DataFrame()。
- 如果你的 XML 是扁平结构(无嵌套、无属性、每条记录同级标签),
xml.etree.ElementTree足够轻量且无需额外安装 - 如果含命名空间、混合文本/子元素、或需要 XPath 精准定位,
lxml更可靠(但需pip install lxml) - 别指望用
csv.writer直接写 XML——XML 不是 CSV,强行按行切会丢结构、崩编码、漏属性
最简可行:用 xml.etree.ElementTree 提取同级字段转 CSV
适用于类似这种格式的 XML(每条 <record></record> 下字段平行、无属性):
<data>
<record>
<name>Alice</name>
<age>30</age>
</record>
<record>
<name>Bob</name>
<age>25</age>
</record>
</data>
对应脚本核心逻辑只有 4 行(不含 import 和保存):
立即学习“Python免费学习笔记(深入)”;
- 用
ET.parse()加载文件,.getroot()拿到根节点 -
[r for r in root.iter('record')]遍历所有记录节点 - 对每个
record,用{child.tag: child.text for child in record}构造字典 - 把字典列表传给
pd.DataFrame(...),再调.to_csv()
注意:child.text 会丢失子元素、属性和空白符;若字段含换行或特殊字符,to_csv() 默认用 quoting=csv.QUOTE_MINIMAL 处理,一般够用。
带属性或嵌套时,lxml + xpath 才不翻车
遇到这种 XML 就必须换工具:
<items>
<item id="101" category="book">
<title lang="en">Python Crash Course</title>
<price currency="USD">39.99</price>
</item>
</items>
xml.etree.ElementTree 的 find() 不支持完整 XPath(比如 @id 或 title/@lang),硬写容易漏字段或报 NoneType 错误。这时用 lxml:
- 用
etree.parse()加载,.xpath('//item')精准抓所有 item 元素 - 字段提取写成:
'id': item.get('id'), 'lang': item.find('title').get('lang'), 'text': item.find('title').text -
item.find()可能返回None,务必加if item.find('title') is not None判断,否则运行时报错 - 中文路径或含空格的 XML 文件,传给
etree.parse()前先用os.path.abspath()转绝对路径,避免某些系统下找不到文件
输出 CSV 时这三件事不检查,回头就得重跑
生成的 CSV 看似成功,但打开乱码、缺列、或 Excel 里全挤在一列,往往是因为:
-
to_csv()默认编码是'utf-8',Windows 上用 Excel 打开会乱码——显式加encoding='utf-8-sig'(加 BOM) - 字段含逗号、换行或引号时,
quoting参数不能省:quoting=csv.QUOTE_ALL最保险(需import csv) - XML 中某条记录少一个字段(比如某个
<price></price>缺失),pd.DataFrame会自动填NaN,但 CSV 里显示为空字符串或nan——如果业务要求空字段留空,得在构造字典时主动设'price': price_elem.text if price_elem is not None else ''
嵌套层级深、属性多、命名空间混用的 XML,靠“一行代码”幻想不现实。解析逻辑得按实际结构写,宁可多几行判断,也别赌默认行为。










