如何用Python读取.zip内的.gz文件?遇NotImplementedError报错
解决
NotImplementedError: That compression method is not supported问题 问题根源
这个报错来自zipfile.ZipFile.open(),说明你的zip包使用了Python标准库zipfile不支持的压缩算法(比如DEFLATE64、LZMA等),或者代码存在冗余解压逻辑。
分步解决方案
1. 确认Zip包的压缩类型
先运行以下代码排查每个文件的压缩格式:
import zipfile zf = zipfile.ZipFile("file.zip", "r") for info in zf.infolist(): compress_type_name = zipfile._compress_type_map.get(info.compress_type, "不支持的压缩类型") print(f"文件: {info.filename} | 压缩类型: {compress_type_name}")
2. 处理不支持的压缩算法
- 如果输出显示「不支持的压缩类型」:
- 若是DEFLATE64格式:安装
zipfile-deflate64库,替换导入语句后再执行逻辑:import zipfile_deflate64 as zipfile - 若是LZMA/7z相关格式:安装
py7zr库,用它读取zip包:import py7zr import pandas as pd with py7zr.SevenZipFile("file.zip", mode='r') as zf: for filename in zf.getnames(): if filename.endswith('.gz'): with zf.open(filename) as gz_stream: df = pd.read_csv(gz_stream, compression='gzip', sep=';') # 此处添加你的DataFrame处理逻辑
- 若是DEFLATE64格式:安装
3. 修正冗余解压逻辑
原代码同时用gzip.GzipFile和pd.read_csv(compression="gzip")做了两次解压,属于冗余操作。简化后的正确代码:
import zipfile import pandas as pd zf = zipfile.ZipFile("file.zip", "r") for info in zf.infolist(): if info.filename.endswith('.gz'): with zf.open(info) as stream: df = pd.read_csv(stream, compression='gzip', sep=';') # 处理DataFrame,例如打印数据示例 print(df.head())
4. 验证Zip包完整性
如果以上方法都无效,手动解压zip包检查:
- 若手动解压失败,说明原zip包损坏,需重新获取;
- 若手动解压后gz文件能正常打开,再排查代码运行环境的依赖问题。
内容的提问来源于stack exchange,提问作者txg
相关产品推荐
相关产品推荐

