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

使用AWS Lambda读取S3中.gz文件遇解压错误的解决求助

解决OSError: Not a gzipped file (b'PK')问题

你遇到的这个错误其实非常直观——你尝试解压的文件根本不是gzip格式,而是ZIP压缩包!b'PK'是ZIP文件开头的标志性字节,这就解释了为什么GzipFile会报错说不是gzipped文件。

为什么会出现这种情况?

从你提供的S3响应来看,虽然ContentType标记为application/x-gzip,但这只是文件的元数据(上传时设置的),和实际文件内容不匹配。大概率是上传时把ZIP文件误命名成了.gz后缀,或者用ZIP压缩了内容却错误标记了gzip类型。

正确的处理方式:用zipfile模块替代gzip

既然实际是ZIP文件,我们直接用Python内置的zipfile模块来处理即可,修改你的代码如下:

import boto3
from io import BytesIO
import zipfile

s3_client = boto3.client('s3')
bucket = "你的桶名称"
key = "你的文件路径/文件名.gz"

# 从S3获取文件对象
retr = s3_client.get_object(Bucket=bucket, Key=key)
bytestream = BytesIO(retr['Body'].read())

# 处理ZIP压缩包
with zipfile.ZipFile(bytestream, 'r') as zip_container:
    # 筛选出压缩包内的txt文件
    txt_file_names = [name for name in zip_container.namelist() if name.endswith('.txt')]
    if not txt_file_names:
        print("压缩包内未找到txt文件")
    else:
        # 读取第一个txt文件的内容
        with zip_container.open(txt_file_names[0]) as txt_file:
            got_text = txt_file.read().decode('utf-8')
            print(got_text)

额外说明

  • 如果压缩包里有多个txt文件,可以遍历zip_container.namelist()逐个处理
  • 建议添加异常处理(比如zipfile.BadZipFile),避免因文件损坏导致Lambda执行失败
  • 后续上传文件时注意匹配文件名后缀和实际压缩格式,避免再出现元数据和内容不匹配的情况

内容的提问来源于stack exchange,提问作者Ganesh Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:40:43