使用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
相关产品推荐
相关产品推荐

