在S3中使用S3.Object()。put()在boto3 1.5.36中存储matplotlib图像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在S3中使用S3.Object()。put()在boto3 1.5.36中存储matplotlib图像相关的知识,希望对你有一定的参考价值。

除了其他的东西,我使用matplotlib绘制图,我想立即存储为S3对象。

根据thisthis other问题以及fine manual提供的答案,我需要S3.Object.put()将我的数据移动到AWS中,程序应该是沿着

from matplotlib import pyplot as plt
import numpy as np
import boto3
import io

# plot something
fig, ax = plt.subplots()
x = np.linspace(0, 3*np.pi, 500)
a = ax.plot(x, np.sin(x**2))

# get image data, cf. https://stackoverflow.com/a/45099838/1129682
buf = io.BytesIO()
fig.savefig(buf, format="png")
buf.seek(0)
image = buf.read()

# put the image into S3
s3 = boto3.resource('s3', aws_access_key_id=awskey, aws_secret_access_key=awssecret)
s3.Object(mybucket, mykey).put(ACL='public-read', Body=image)

但是,我最终得到一个内容长度为零的新S3对象。

下面给我一个内容长度为6的新S3对象。

s3.Object(mybucket, mykey).put(ACL='public-read', Body="foobar")

当我放下一行时,我最终得到了S3对象中的内容,但它不是一个可用的图像:

s3.Object(mybucket, mykey).put(ACL='public-read', Body=str(image))

我可以通过浏览实际文件来使其工作,如下所示:

with open("/tmp/iamstupid","wb") as fh:
    fig.savefile(fh, format="png")
s3.Bucket(mybucket).upload_file("/tmp/iamstupid", mykey)

所以它似乎工作。我无法正确使用界面。我究竟做错了什么?如何使用S3.Object.put()实现我的目标

答案

我能够解决它。我在this question找到了答案。它是一个Python3的东西。根据我的理解,Python3“通常”与unicode一起使用。如果你想要单个字节,你必须明确它。因此,正确的用法是

s3.Object(mybucket, mykey).put(ACL='public-read', Body=bytes(image))

我发现这有点奇怪,因为buf.read()已经应该返回bytes类型的对象,但我确实停止想知道,b / c它现在有效。

以上是关于在S3中使用S3.Object()。put()在boto3 1.5.36中存储matplotlib图像的主要内容,如果未能解决你的问题,请参考以下文章

aws 的 s3 put_object vs upload_file

无法在 go 中使用 AWS 开发工具包获取 s3.Object ACL

如何使用aws-java-sdk从S3读取块的文件块

S3 选择 CSV 中的检索标头

如何在Java中为SNSEvent和S3Event使用多个LambdaFunctionHandler?

boto3 S3 对象解析