You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:12:07