有没有一种使用boto3将文件直接写入S3的方法?

28
我写了一个Python脚本处理非常大的文件(总共几TB),我将在EC2实例上运行该脚本。之后,我想将处理后的文件存储在S3桶中。目前,我的脚本先将数据保存到磁盘,然后再上传到S3。不幸的是,由于需要等待实例先写入磁盘再上传,这将非常昂贵。
是否有任何方法可以使用boto3将文件直接写入S3桶?
编辑:为了澄清我的问题,我想知道如果我有一个内存对象,是否可以直接将该对象写入S3,而无需先将该对象保存到磁盘上。
2个回答

27
你可以使用put_object来完成此操作。只需将文件对象作为body传递即可。
例如:
import boto3

client = boto3.client('s3')
response = client.put_object( 
    Bucket='your-s3-bucket-name',
    Body='bytes or seekable file-like object',
    Key='Object key for which the PUT operation was initiated'
)

4
这正是我所需要的。对于任何想知道的人,我的脚本现在会首先使用pickle.dumps来创建对象的字节表示。然后,像上面描述的那样使用put_object直接写入S3。要稍后检索对象,请使用get_object从S3获取,并使用pickle.loads进行反序列化。 - Richard Sun
1
什么是密钥? - Jwan622
1
@Jwan622,那将是您的文件名。 - Nic
这是否仍然可以使用高级API,例如boto3.transfer? - Famous Jameis

0

它使用S3的put_object方法工作:

key = 'filename'
response = s3.put_object(Bucket='Bucket_Name',
                         Body=json_data,
                         Key=key)

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