Python使用xmltodict读取xml.dump报utf-8解码错误如何解决
错误产生原因
这个报错的核心是读取文件时用的解码规则,和文件本身的实际存储格式/编码不匹配:
- UTF-8编码规则里,
0x80属于非法的起始字节,只要读到这个字节就会触发解码失败 - 你手动加
encoding='UTF-8'只是强制Python用UTF-8规则解码,不会自动转换文件编码,只要文件本身不是UTF-8编码,报错就不会消失 - 结合
.dump后缀判断,大概率你拿到的文件根本不是纯文本格式的XML文件,常见情况包括:文件是gzip/zip压缩包、Python pickle序列化的二进制文件、或者是用Windows-1252/GBK/Latin-1等非UTF-8编码保存的XML文本。
修复方案
按以下步骤排查处理:
1. 先确认文件真实格式
不要直接按文本读文件,先以二进制模式读取前16个字节,判断文件头:
with open('file1.xml.dump', 'rb') as f: # 打印前16个字节的二进制标识 print(f.read(16))
根据输出结果对应处理:
- 输出开头为
b'PK\x03\x04':文件是zip/gzip压缩包,很多公开的XML数据集dump默认用gzip压缩,后缀名可能没标.gz,需要先解压再读取 - 输出开头为
b'\x80\x04'类格式:文件是Python pickle序列化生成的二进制文件,不是XML格式,不能用xmltodict读取,需要用pickle.load()加载 - 输出开头为
b'<?xml':文件是纯文本XML,进入下一步调整编码即可
2. 纯文本XML的编码适配
如果确认是XML文本,不要硬指定UTF-8编码,优先尝试以下两种常见编码:
- Windows平台生成的XML文件优先试
encoding='cp1252'(Windows-1252编码里0x80对应欧元符号,是合法字符) - 不确定编码的情况下可以试
encoding='latin-1',该编码对单字节的映射覆盖0-255所有值,不会触发解码错误,读取后再根据内容调整编码即可
示例代码:
import xmltodict with open('file1.xml.dump', encoding='cp1252') as fd: doc = xmltodict.parse(fd.read())
额外提示:xmltodict.parse()原生支持传入字节类型数据,你也可以直接以二进制模式读文件内容传给parse方法,库会自动读取XML头里声明的编码做解析,不需要手动指定encoding:
import xmltodict with open('file1.xml.dump', 'rb') as fd: # 直接传二进制内容,自动识别编码 doc = xmltodict.parse(fd.read())
3. 压缩格式dump的读取
如果确认是gzip压缩的XML dump,不需要手动解压,直接用gzip模块读取二进制流即可:
import gzip import xmltodict with gzip.open('file1.xml.dump', 'rb') as fd: doc = xmltodict.parse(fd.read())
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

