使用boto3将内存对象写入S3

6

我想直接将文件写入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 对象位于 0x045DC540)

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


你是否遇到了错误? - jordanm
当我使用原始方法时,我得到的错误是:TypeError: coercing to Unicode: need string or buffer, cStringIO.StringO found.当我使用第二种方法时,程序会卡住,停在writetos3方法的最后一行。 - bubba4399
1个回答

1
看起来你想要这个:

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

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


谢谢您的建议,我本来打算升级到3.0版本,但现在我已经转换了脚本。在转换语法并使用您建议的更改运行该方法后,我现在遇到了以下错误:TypeError: 期望 str、bytes 或 os.PathLike 对象,而不是 _io.StringIO。 - bubba4399
最终,我通过将stringIO对象转换为字符串,然后再将其传递给writetoS3方法来解决了这个问题。 - bubba4399

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接