我想创建一个从 S3 获取 zip 文件(可能包含 csv 文件列表)的 lambda,将其解压缩并上传回 s3。
由于 lambda 受到内存/磁盘大小的限制,我必须将其从 s3 流式传输并返回到其中。
我使用 python (boto3)
请参阅下面的我的代码
count = 0
obj = s3.Object( bucket_name, key )
buffer = io.BytesIO(obj.get()["Body"].read())
print (buffer)
z = zipfile.ZipFile(buffer)
for x in z.filelist:
with z.open(x) as foo2:
print(sys.getsizeof(foo2))
line_counter = 0
out_buffer = io.BytesIO()
for f in foo2:
out_buffer.write(f)
# out_buffer.writelines(f)
line_counter += 1
print (line_counter)
print foo2.name
s3.Object( bucket_name, "output/"+foo2.name+"_output" ).upload_fileobj(out_buffer)
out_buffer.close()
z.close()
结果是,在存储桶中创建空文件。
例如:如果文件:input.zip 包含文件:1.csv,2.csv
我在桶中得到了 2 个具有相应名称的空 csv 文件。
另外,我不确定它是否确实流式传输文件,或者只是下载所有 zip 文件
谢谢
你需要seek https://docs.python.org/3/library/io.html#io.IOBase.seek返回到上传之前的 ByesIO 文件的开头。
out_buffer = io.BytesIO()
for f in foo2:
out_buffer.write(f)
# out_buffer.writelines(f)
line_counter += 1
out_buffer.seek(0) # Change stream position to beginning of file
s3.Object( bucket_name, "output/"+foo2.name+"_output").upload_fileobj(out_buffer)
out_buffer.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)