【问题标题】:Storing matplotlib images in S3 with S3.Object().put() on boto3 1.5.36在 boto3 1.5.36 上使用 S3.Object().put() 在 S3 中存储 matplotlib 图像
【发布时间】:2018-08-08 20:00:07
【问题描述】:

我正在使用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() 实现我的目标

【问题讨论】:

    标签: python-3.x matplotlib amazon-s3 io boto3


    【解决方案1】:

    我能够解决它。我在this question 中找到了答案。它是 Python3 的东西。据我了解,Python3“通常”适用于 unicode。如果您想要单个字节,则必须明确说明。因此正确的用法是

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

    我觉得这有点奇怪,因为 buf.read() 已经应该返回 bytes 类型的对象,但我确实不再怀疑,b/c 现在可以工作了。

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 2021-07-26
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多