Python调用gzip模块解压.dsx文件报BadGzipFile错误
问题原因
报错的核心原因是文件格式和你预期的不一致:
- Python的
gzip模块会严格校验gzip格式的文件头:标准gzip文件开头两个字节必须是固定魔数\x1f\x8b,不符合就直接抛出BadGzipFile错误。你看到的报错里提示读到的头是b'PK',这是ZIP压缩格式的标志性头(来自ZIP发明者Phil Katz的姓名缩写),说明这个.dsx文件实际是ZIP封装的压缩包,不是纯gzip格式。 - 命令行gzip工具能正常解压,是因为GNU版的命令行gzip做了多格式兼容:如果输入是仅包含单个文件的ZIP压缩包,它会自动识别并解压内部内容,不需要额外参数。但Python标准库的gzip模块没有实现这层兼容逻辑,只支持标准gzip格式,哪怕你把文件改后缀为
.gz也无法识别,这也是你用Python的gzip命令行模式同样报错的原因。
解决方法
这类.dsx都是仅包含单个XML文件的ZIP包,直接用Python标准库的zipfile模块读取即可,读取包内第一个文件的内容,就能得到和命令行gzip输出完全一致的结果,参考代码:
import sys import zipfile def main(): file_path = sys.argv[1] with zipfile.ZipFile(file_path, 'r') as zf: # 取压缩包内唯一的XML文件 inner_file_name = zf.namelist()[0] with zf.open(inner_file_name, 'rb') as f: content = f.read() # 输出XML文本,编码可根据XML头声明调整,绝大多数场景用utf-8即可 print(content.decode('utf-8')) if __name__ == "__main__": main()
如果解码时出现编码错误,查看XML文件开头的<?xml ... encoding="xxx"?>声明,把decode的参数换成对应的编码即可。
内容的提问来源于stack exchange,提问作者mitchkman
相关产品推荐
相关产品推荐

