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
相关产品推荐
相关产品推荐

