如何使用python将流上传到AWS s3

时间:2018-01-30 15:45:51

标签: python amazon-s3 lambda boto3 unzip

我想创建一个lambda,它从S3获取一个zip文件(可能包含一个csv文件列表),解压缩并上传回s3。 由于lambda受内存/磁盘大小的限制,我必须从s3流回来并返回到它。 我用python(boto3) 看下面我的代码(我更像是一个java人,蟒蛇新手......)

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()

结果是,在桶中创建空文件。 例如:if file:input.zip包含的文件:1.csv,2.csv 我在桶中输入2个带有相应名称的空csv文件。 另外,我不确定它确实流式传输文件,或者只是下载所有的zip文件 感谢

2 个答案:

答案 0 :(得分:0)

您可以从S3解压缩文件并将其解压缩到S3。

<div id="box-shadow-wrapper" class="right-column" style="background-color: rgb(0, 84, 68);">
  <div class="box-wrap">
  </div>
</div>

.right-column {
    float: left;
    width: 600px;
    height: 531px;
    position: relative;
}

.box-wrap {
    width: 390px;
    height: 370px;
    margin: 77px auto 0;
    margin-top: 77px;
    margin-right: auto;
    margin-bottom: 0px;
    margin-left: auto;
    position: relative;
    box-shadow: rgb(0, 84, 68) 0px 24px 13px 42px inset;
    background-color: white;
}

参考-https://github.com/vhvinod/ftp-to-s3/blob/master/extract-s3-to-s3.py

答案 1 :(得分:-1)

在上传之前,您需要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()