使用NumPy解压.gz文件时遇zlib.error错误的解决求助
解决zlib.error: invalid stored block lengths解压错误
问题分析
你遇到的zlib.error: Error -3 while decompressing data: invalid stored block lengths错误,大概率是下载的.gz文件存在完整性问题,但重新下载后仍报错,说明可能是下载方式导致文件未正确保存,或是当前gzip读取逻辑不兼容该文件的压缩格式。
解决方案
1. 手动验证文件完整性
用本地解压工具(比如7-Zip)直接尝试解压目标.gz文件:
- 如果工具也报错,说明文件确实损坏,需换用更可靠的下载工具重新获取;
- 如果工具能正常解压,说明是代码中解压逻辑的问题,继续尝试以下方案。
2. 修正下载逻辑(针对urllib3)
用urllib3下载二进制文件时,必须以二进制模式写入,避免编码转换破坏文件结构:
import urllib3 import shutil url = "https://data.remss.com/windsat/bmaps_v07.0.1/y2016/m08/wsat_20160801v7.0.1_d3d.gz" http = urllib3.PoolManager() with http.request('GET', url, preload_content=False) as r, open('wsat_20160801v7.0.1_d3d.gz', 'wb') as out_file: shutil.copyfileobj(r, out_file)
如果仍有问题,换用requests库下载,稳定性更强:
import requests url = "https://data.remss.com/windsat/bmaps_v07.0.1/y2016/m08/wsat_20160801v7.0.1_d3d.gz" response = requests.get(url, stream=True) with open('wsat_20160801v7.0.1_d3d.gz', 'wb') as f: for chunk in response.iter_content(chunk_size=1024*1024): f.write(chunk)
3. 更换解压读取方式
如果文件本身无损坏,但gzip.open直接读取报错,可以先解压到临时文件,再用numpy读取:
import numpy as np import gzip import tempfile import os import shutil data_file = "wsat_20160801v7.0.1_d3d.gz" # 先解压到临时文件 with gzip.open(data_file, 'rb') as f_in, tempfile.NamedTemporaryFile(delete=False, mode='wb') as f_out: shutil.copyfileobj(f_in, f_out) # 读取二进制数据 data = np.fromfile(f_out.name, dtype=np.uint8) # 清理临时文件 os.unlink(f_out.name) # 执行重塑操作 data = data.reshape((8, 1440, 720))
4. 确认文件格式匹配
检查Windsat官方文档,确认该文件的二进制数据类型是否确实为uint8,如果官方标注为其他类型(比如int16),需要调整np.fromfile的dtype参数。
内容的提问来源于stack exchange,提问作者Hartley
相关产品推荐
相关产品推荐

