下面是我用来读取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
但它对我也不起作用, 请建议我如何读取文件内容
答案 0 :(得分:2)
将其填写为正确的答案。工作代码为:
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
(在虚拟内存中为htop中的VIRT
)。解压缩后的文件为308M
。