如何通过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
相关产品推荐
相关产品推荐

