You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XML转CSV遇UTF-8编码错误,指定编码与recover模式仍报错求助

解决XML转CSV的编码解析错误

错误根源分析

报错里的字节 0xFC 0x74 0xFC 0x70 对应ISO-8859-1(Latin-1)编码的字符 ütüp,说明你的XML文件实际编码不是UTF-8,而是单字节编码(比如ISO-8859-1、Windows-1252),指定utf-8解析自然会报错,recover=True 只能修复XML格式错误,解决不了编码不匹配的问题。

具体解决步骤

1. 检测文件实际编码

先确认文件的真实编码,用chardet库快速检测:

import chardet

with open("input/stackoverflow.com/Posts.xml", "rb") as f:
    result = chardet.detect(f.read(10000))  # 读取部分内容检测
print(result["encoding"])  # 输出类似 'ISO-8859-1' 或 'Windows-1252'

2. 指定正确编码解析XML

拿到编码后,在解析时指定对应编码,同时针对大文件用迭代解析避免内存溢出:

from lxml import etree
import csv

# 替换成检测到的编码,比如 'ISO-8859-1'
parser = etree.XMLParser(encoding="ISO-8859-1")

# 迭代解析大XML文件,避免一次性加载200万条记录
with open("output.csv", "w", encoding="utf-8", newline="") as csv_file:
    writer = csv.writer(csv_file)
    # 先写CSV表头(根据你的XML节点字段调整)
    writer.writerow(["Id", "PostTypeId", "Title", "Body"])

    for event, elem in etree.iterparse("input/stackoverflow.com/Posts.xml", events=("end",), tag="row", parser=parser):
        # 提取XML节点属性(根据你的实际结构调整)
        row_data = [
            elem.get("Id"),
            elem.get("PostTypeId"),
            elem.get("Title"),
            elem.get("Body")
        ]
        writer.writerow(row_data)
        elem.clear()  # 清理节点释放内存

3. 若检测编码仍有问题

如果chardet检测结果不准确,可尝试直接用Windows-1252编码解析(它是ISO-8859-1的超集,覆盖更多特殊字符),替换上述代码里的encoding参数即可。

内容的提问来源于stack exchange,提问作者Ambitiouscoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:12:37