【问题标题】:Write in memory object to S3 via boto3通过 boto3 将内存对象写入 S3
【发布时间】:2018-04-27 17:57:44
【问题描述】:

我正在尝试将文件直接写入 S3,而不创建本地文件然后上传。

我正在使用 cStringIO 在内存中生成一个文件,但我无法确定将其上传到 boto3 的正确方法。

def writetos3(sourcedata, filename, folderpath):
     s3 = boto3.resource('s3')
     data = open(sourcedata, 'rb')
     s3.Bucket('bucketname').put_object(Key= folderpath + "/" + filename, Body=data)

以上是我之前在本地文件中使用的标准 boto3 方法,如果没有本地文件,它就无法工作,我收到以下错误:coercing to Unicode: need string or buffer, cStringIO.StringO found .

由于内存中的文件(我相信)已经被认为是打开的,我尝试将其更改为下面的代码,但它仍然不起作用,没有错误,脚本只是挂在方法的最后一行。

def writetos3(sourcedata, filename, folderpath):
    s3 = boto3.resource('s3')
    s3.Bucket('bucketname').put_object(Key= folderpath + "/" + filename, Body=sourcedata)

只是为了获得更多信息,我试图写的值看起来像这样

(cStringIO.StringO object at 0x045DC540)

有人知道我在这里做错了什么吗?

【问题讨论】:

  • 你收到错误了吗?
  • 当我使用原始方法时,我得到的错误是:TypeError: coercing to Unicode: need string or buffer, cStringIO.StringO found。当我使用第二种方法时,程序只是挂起,卡在 writetos3 方法的最后一行

标签: amazon-s3 python-3.6 boto3 cstringio


【解决方案1】:

看起来你想要这个:

    data = open(sourcedata, 'rb').decode()

默认为 utf8。另外,我鼓励你在 python3 下运行你的代码,并为你的问题使用适当的语言标签。

【讨论】:

  • 感谢您的建议,我正计划升级到 3.0,但我现在就继续转换脚本。转换语法并使用建议的更改运行方法后,我现在收到以下错误:TypeError: expected str, bytes or os.PathLike object, not _io.StringIO
  • 我最终通过简单地将 stringIO 对象转换为字符串,然后将其传递给 writetoS3 方法来解决问题。
猜你喜欢
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
相关资源
最近更新 更多