如何使用boto3将文件或数据写入S3对象

时间:2016-10-31 05:13:45

标签: python amazon-web-services amazon-s3 boto boto3

在boto 2中,您可以使用以下方法写入S3对象:

是否有boto 3等效?什么是将数据保存到存储在S3上的对象的boto3方法?

7 个答案:

答案 0 :(得分:115)

在boto 3中,'Key.set_contents_from_'方法被

取代

例如:

import boto3

some_binary_data = b'Here we have some data'
more_binary_data = b'Here we have some more data'

# Method 1: Object.put()
s3 = boto3.resource('s3')
object = s3.Object('my_bucket_name', 'my/key/including/filename.txt')
object.put(Body=some_binary_data)

# Method 2: Client.put_object()
client = boto3.client('s3')
client.put_object(Body=more_binary_data, Bucket='my_bucket_name', Key='my/key/including/anotherfilename.txt')

或者,二进制数据可以来自读取文件,如the official docs comparing boto 2 and boto 3

中所述
  

存储数据

     

从文件,流或字符串存储数据非常简单:

# Boto 2.x
from boto.s3.key import Key
key = Key('hello.txt')
key.set_contents_from_file('/tmp/hello.txt')

# Boto 3
s3.Object('mybucket', 'hello.txt').put(Body=open('/tmp/hello.txt', 'rb'))

答案 1 :(得分:25)

boto3还有一种直接上传文件的方法:

{$date} {php}global $date; echo "-".$date."-"; echo date("Y",strtotime(date("Y-m-d",$date)." -1 year")){/php}

http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.upload_file

答案 2 :(得分:17)

这是从s3读取JSON的一个很好的技巧:

import json, boto3
s3 = boto3.resource("s3").Bucket("bucket")
json.load_s3 = lambda f: json.load(s3.Object(key=f).get()["Body"])
json.dump_s3 = lambda obj, f: s3.Object(key=f).put(Body=json.dumps(obj))

现在,您可以使用与json.load_s3json.dump_s3相同的API loaddump

data = {"test":0}
json.dump_s3(data, "key") # saves json to s3://bucket/key
data = json.load_s3("key") # read json from s3://bucket/key

答案 3 :(得分:8)

在S3中写入文件之前,您不再需要将内容转换为二进制文件。以下示例在具有字符串内容的S3存储桶中创建一个新的文本文件(称为newfile.txt):

import boto3

s3 = boto3.resource(
    's3',
    region_name='us-east-1',
    aws_access_key_id=KEY_ID,
    aws_secret_access_key=ACCESS_KEY
)
content="String content to write to a new S3 file"
s3.Object('my-bucket-name', 'newfile.txt').put(Body=content)

答案 4 :(得分:2)

更简洁的版本,可用于将文件动态上传到给定的S3存储桶和子文件夹-

import boto3

BUCKET_NAME = 'sample_bucket_name'
PREFIX = 'sub-folder/'

s3 = boto3.resource('s3')

# Creating an empty file called "_DONE" and putting it in the S3 bucket
s3.Object(BUCKET_NAME, PREFIX + '_DONE').put(Body="")

注意 :您应该始终将AWS凭证(aws_access_key_idaws_secret_access_key)放在单独的文件中,例如- ~/.aws/credentials

答案 5 :(得分:0)

值得一提的是smart-open使用boto3作为后端。

smart-open是python open的直接替代品,可以从s3以及ftphttp和许多其他协议中打开文件

例如

from smart_open import open
import json
with open("s3://your_bucket/your_key.json", 'r') as f:
    data = json.load(f)

aws凭证通过boto3 credentials加载,通常是~/.aws/目录中的文件或环境变量。

答案 6 :(得分:0)

您可以使用以下代码进行写操作,例如在2019年将图像写入S3。要连接到S3,您将必须使用命令pip install awscli安装AWS CLI,然后使用命令{输入少量凭证{1}}:

aws configure