import boto3
from io import StringIO
s3 = boto3.client('s3')
display = # Altair Charting
buff = StringIO(display.save(str_obj, 'html'))
s3.upload_fileobj(buff.read(), BUCKET, 'index.html')
我认为完整的示例会使问题变得复杂,因此我将 Altair 图表注释掉了。
无论如何,我尝试实施大量将对象和文件保存到 AWS S3 存储桶的建议,但我不理解。
保存到磁盘非常简单:
display.save('index.html')
比较起来,将其放到 S3 上似乎极其困难。我不确定我在这里缺少什么。或许是upload_fileobj
不是正确的方法,但我一直在努力使这项工作有效。
该方法的具体错误是ValueError: Fileobj must implement read
UPDATE:
buff = StringIO(display.save('str.html'))
s3.put_object(
Bucket=BUCKET,
Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html',
Body=buff.read()
)
结果为 0 字节文件index.html
在我的桶上
更新2:
str_obj = StringIO()
display.save(str_obj, 'html')
buff = str_obj.read()
s3.put_object(
Bucket=BUCKET,
Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html',
Body=buff
)
这也是行不通的。我简直不敢相信将文件保存到 S3 会如此复杂。事后注意:我没有getvalue()
所需的方法buff
解决方案:
这不是我第一次与 S3 文件作斗争,所以我可能会将其留给我自己的未来参考。也就是说,我仍然不清楚为什么我无法以字符串形式保存“.html”文件。
import boto3
from io import StringIO
s3 = boto3.client('s3')
display = # Altair Charting
str_obj = StringIO() # instantiate in-memory string object
display.save(str_obj, 'html') # saving to memory string object
buf = str_obj.getvalue().encode() # convert in-memory string to bytes
# Upload as bytes
s3.put_object(
Bucket=BUCKET,
Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html',
Body=buf
)