【问题标题】:Reading contents of a gzip file from a AWS S3 using Boto3使用 Boto3 从 AWS S3 读取 gzip 文件的内容
【发布时间】:2019-05-02 14:57:40
【问题描述】:

下面是我用来读取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'

除了 e 例外: 打印(e) 提高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"

python版本-3.7

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

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

【问题讨论】:

  • 您的命名约定有冲突。将gzip = BytesIO(n) 的变量名分配更改为不同的变量名。正如所写,您通过在代码中命名变量 gzip 来覆盖 gzip 模块的功能。
  • @vealkind 谢谢这是一个愚蠢的错误

标签: python amazon-s3 aws-sdk boto3


【解决方案1】:

将其完成为正确的答案。工作代码是:

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 循环中仅以解压缩形式的每一行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 2016-07-12
    • 1970-01-01
    • 2018-05-13
    • 2021-10-18
    • 2017-04-21
    • 2017-10-15
    • 2017-09-29
    相关资源
    最近更新 更多