繁体   English   中英

使用 Boto3 从 AWS S3 读取 gzip 文件的内容

[英]Reading contents of a gzip file from a AWS S3 using Boto3

下面是我用来读取 gz 文件的代码

import json
import boto3
from io import BytesIO
import gzip

def lambda_handler(event, context):
try:
 s3 = boto3.resource('s3')
 key='test.gz'
 obj = s3.Object('athenaamit',key)
 n = obj.get()['Body'].read()
 #print(n)
 gzip = BytesIO(n)
 gzipfile = gzip.GzipFile(fileobj=gzip)
 content = gzipfile.read()
 print(content)
 return 'dddd'

除了 Exception as e: print(e) raise e 但我得到以下错误

 "errorMessage": "'_io.BytesIO' object has no attribute 'GzipFile'",
 "stackTrace": [
 "  File \"/var/task/lambda_function.py\", line 20, in lambda_handler\n    raise e\n",
"  File \"/var/task/lambda_function.py\", line 14, in lambda_handler\n    gzipfile = gzip.GzipFile(fileobj=gzip)\n"

蟒蛇版本-3.7

我还尝试实施以下建议https://stackoverflow.com/questions/32794837/pass-io-bytesio-object-to-gzip-gzipfile-and-write-to-gzipfile

但它也不适合我,请建议我如何阅读文件内容

把它整理成一个正确的答案。 工作代码将是:

s3 = boto3.resource('s3')
obj = s3.Object('my-bucket-name','path/to/file.gz')
buf = io.BytesIO(obj.get()["Body"].read()) # reads whole gz file into memory
for line in gzip.GzipFile(fileobj=buf):
    # do something with line

我有点担心内存占用,但似乎只有 gz 文件保存在内存中(上面的第 3 行)。 然后只有在for line循环中解压缩形式的每一for line

对于38M的 gz 文件,我的内存占用为47M (在虚拟内存中,在 htop 中为VIRT )。 解压后的文件大小为308M

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM