如何解压内含CSV的gunzip文件?代码报bad zip file错误如何处理
gunzip解压底层逻辑
- gunzip基于DEFLATE无损压缩算法实现解压能力,DEFLATE由LZ77字典压缩算法和哈夫曼熵编码算法组合而成
- 解压第一步会校验文件头合法性:标准gzip文件前2字节为固定魔数
0x1F 0x8B,第3字节标识压缩算法(固定为0x08代表DEFLATE),后续头字段存储原始文件名、文件修改时间、操作系统类型等元数据 - 头校验通过后逐块解析压缩数据:先还原块对应的哈夫曼编码树,再通过编码树解码得到LZ77的匹配偏移量、匹配长度信息,结合滑动窗口字典还原出原始字节流
- 全量数据解压完成后,会用文件末尾存储的4字节CRC32校验值、4字节原始数据长度,和解压得到的实际数据做一致性校验,校验失败就会抛出文件损坏类错误
报错原因分析
你遇到的bad zip file错误核心有两类可能:
- 你没有对gzip压缩文件做解压操作,直接把压缩后的字节流当成普通csv或者zip文件读取,格式不匹配触发报错
- 你手中的gzip文件本身不完整、被篡改,头魔数或者尾部校验值不合法,无法通过gunzip的基础校验
另外你贴出的写csv代码本身存在逻辑错误:writer.writerows()要求入参是逐行组成的字典列表,而df.to_dict()默认返回以列名为key、整列数据为value的嵌套字典,格式不匹配会导致写入内容异常。
正确实现代码
直接解压本地gzip文件得到CSV
import gzip import shutil # 输入为你的gzip文件路径,输出为解压后的csv路径 with gzip.open("your_file.csv.gz", "rb") as gz_f: with open("output.csv", "wb") as csv_f: shutil.copyfileobj(gz_f, csv_f)
直接将DataFrame写入gzip压缩的CSV文件
import gzip import csv with gzip.open("xyz.csv.gz", "wt", encoding="utf-8") as gz_f: writer = csv.DictWriter(gz_f, fieldnames=df.columns.to_list()) writer.writeheader() # to_dict传入'records'参数生成逐行字典列表 writer.writerows(df.to_dict("records"))
Pandas直接读取gzip压缩的CSV文件
import pandas as pd # 无需提前手动解压,pandas自动处理gzip解压 df = pd.read_csv("your_file.csv.gz", compression="gzip")
内容的提问来源于stack exchange,提问作者Rakesh D
相关产品推荐
相关产品推荐

