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

使用Python ElementTree解析iTunes导出XML时遇UnicodeDecodeError问题

问题分析与解决方案

这大概率是iTunes导出的XML文件编码不规范导致的问题,而非你的代码或者Python ElementTree的处理逻辑出错。

为什么会出现这个错误?

你提到XML头声明是<?xml version="1.0" encoding="UTF-8"?>,但实际文件里却包含了0x8D这个字节——这个字节在UTF-8编码中是无效的,但它是Windows-1252编码里的软连字符。这说明iTunes在导出时并没有严格按照声明的UTF-8编码生成文件,而是混入了Windows系统编码的字符。

至于为什么iTunes、oXygen编辑器和Stack Overflow能正常显示:

  • iTunes作为生成方,自然能识别自己实际用的编码;
  • oXygen这类专业工具会自动检测文件的实际编码,不会死板地只看XML声明;
  • Stack Overflow在处理文本粘贴时,可能自动完成了编码转换,所以你看不到异常。

而Python的ElementTree在Windows环境下,如果直接传入文件名给iterparse,它会尝试按XML声明的UTF-8解码,但遇到无效字节时就会抛出UnicodeDecodeError——这是它严格遵循编码规范的表现。

如何让程序继续解析?

你可以通过手动控制文件打开时的编码和错误处理逻辑来解决这个问题,有两种常用方案:

方案1:用UTF-8解码并替换无效字符

如果你想保留尽可能多的内容,同时跳过无法解码的字节(用?代替),可以在打开文件时指定errors='replace':

import xml.etree.ElementTree as ET

def parse_tree(source):
    # 手动打开文件,指定UTF-8编码,替换无效字符为?
    with open(source, 'r', encoding='utf-8', errors='replace') as f:
        parser = ET.iterparse(f)
        for action, elem in parser:
            # 这里写你的元素处理逻辑
            print(elem.tag, elem.text)
            
            # 注意:处理完元素后调用clear()避免内存泄漏
            elem.clear()

方案2:直接用Windows-1252编码解析

如果确认文件实际是Windows-1252编码(毕竟你用的是Windows 10,iTunes可能默认用系统编码),可以直接指定编码为cp1252,这样0x8D会被正确解码为软连字符:

import xml.etree.ElementTree as ET

def parse_tree(source):
    with open(source, 'r', encoding='cp1252') as f:
        parser = ET.iterparse(f)
        for action, elem in parser:
            # 你的处理逻辑
            elem.clear()

这两种方案都能让你的程序继续解析文件,不会因为个别无效字节而中断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:18:11