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

如何通过zipfile读取UTF-16编码的XML文件到Pandas?

解决Zip包中UTF-16编码XML读取到Pandas DataFrame的问题

问题核心在于:zipfile.ZipFile.open()返回的是二进制文件对象,而pd.read_xml在接收二进制流时,encoding参数不会生效——因为二进制流需要先解码为文本格式,pandas无法直接对二进制流应用编码设置,导致解码失败。

下面是两种无需手动解压的可行方案:

方案1:用io.TextIOWrapper包装二进制流

通过io.TextIOWrapper将zip包中的二进制流直接解码为UTF-16文本流,再传给pd.read_xml:

import zipfile
import pandas as pd
import io

# 替换为你的Zip包路径
with zipfile.ZipFile("your_data_archive.zip", 'r') as zf:
    # 替换为Zip包内目标XML文件名
    with zf.open("data1.xml") as binary_f:
        # 包装为UTF-16编码的文本流
        text_stream = io.TextIOWrapper(binary_f, encoding='utf-16')
        data_df = pd.read_xml(text_stream)

方案2:读取二进制内容后解码为字符串

先读取二进制数据,解码为UTF-16字符串,再用io.StringIO包装成文本流传递:

import zipfile
import pandas as pd
import io

with zipfile.ZipFile("your_data_archive.zip", 'r') as zf:
    with zf.open("data1.xml") as binary_f:
        # 读取二进制并解码为UTF-16字符串
        xml_str = binary_f.read().decode('utf-16')
        data_df = pd.read_xml(io.StringIO(xml_str))

批量处理Zip包中所有XML文件

如果需要读取Zip内所有XML文件并合并为一个DataFrame,可以遍历文件列表:

import zipfile
import pandas as pd
import io

all_dfs = []
with zipfile.ZipFile("your_data_archive.zip", 'r') as zf:
    # 遍历Zip内所有文件
    for file_name in zf.namelist():
        if file_name.endswith('.xml'):
            with zf.open(file_name) as binary_f:
                text_stream = io.TextIOWrapper(binary_f, encoding='utf-16')
                df = pd.read_xml(text_stream)
                # 可选:添加列标记数据来源文件
                df['source_file'] = file_name
                all_dfs.append(df)

# 合并所有DataFrame
combined_df = pd.concat(all_dfs, ignore_index=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:01:22