use*_*682 5 io matplotlib amazon-s3 python-3.x boto3
除其他外,我正在使用 绘制图matplotlib
,我想立即将其存储为 S3 对象。
根据this和this other question以及精美手册中提供的答案,我需要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. /sf/answers/3156988691/
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)
Run Code Online (Sandbox Code Playgroud)
但是,我最终得到了一个内容长度为零的新 S3 对象。
下面给了我一个内容长度为 6 的新 S3 对象。
s3.Object(mybucket, mykey).put(ACL='public-read', Body="foobar")
Run Code Online (Sandbox Code Playgroud)
当我放置下一行时,我最终在 S3 对象中得到了内容,但它不是可用的图像:
s3.Object(mybucket, mykey).put(ACL='public-read', Body=str(image))
Run Code Online (Sandbox Code Playgroud)
我可以通过一个实际的文件来使它工作,像这样:
with open("/tmp/iamstupid","wb") as fh:
fig.savefile(fh, format="png")
s3.Bucket(mybucket).upload_file("/tmp/iamstupid", mykey)
Run Code Online (Sandbox Code Playgroud)
所以它似乎有效。我只是无法正确使用界面。我究竟做错了什么?我怎样才能实现我的目标S3.Object.put()
我能够解决它。我在这个问题中找到了答案。它是Python3 的东西。据我了解,Python3“通常”适用于 unicode。如果你想要单个字节,你必须明确它。因此正确的用法是
s3.Object(mybucket, mykey).put(ACL='public-read', Body=bytes(image))
Run Code Online (Sandbox Code Playgroud)
我觉得这有点奇怪,因为buf.read()
它已经应该返回一个类型的对象bytes
,但我确实不再想了,因为它现在可以工作了。
归档时间: |
|
查看次数: |
1549 次 |
最近记录: |