在 boto 2中,可以使用以下方法写入 S3对象:
是否存在 boto3等价物? 将数据保存到 S3上存储的对象的 boto3方法是什么?
在 boto 3中,‘ Key.set _ content _ from _’方法被替换为
Object.put ()
Put _ object ()
例如:
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')
或者,二进制数据可以来自读取文件,如 官方文件比对了 boto 2和 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'))
从文件、流或字符串存储数据很容易:
# 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'))
Boto3还有一种直接上传文件的方法:
s3 = boto3.resource('s3') s3.Bucket('bucketname').upload_file('/local/file/here.txt','folder/sub/path/to/s3key')
Http://boto3.readthedocs.io/en/latest/reference/services/s3.html#s3.bucket.upload_file
这里有一个从 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))
现在您可以使用与 load和 dump具有相同 API 的 json.load_s3和 json.dump_s3
load
dump
json.load_s3
json.dump_s3
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
在写入 S3中的文件之前,不再需要将内容转换为二进制文件。下面的示例在 S3 bucket 中创建一个新的文本文件(称为 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)
一个简洁明了的版本,我用来上传文件的动态给定的 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_id和 aws_secret_access_key)放在一个单独的文件中,例如 -~/.aws/credentials
aws_access_key_id
aws_secret_access_key
~/.aws/credentials
值得一提的是使用 boto3作为后端的 聪明开放。
boto3
smart-open是 Python 的 open的替代产品,它可以打开来自 s3、 ftp、 http和许多其他协议的文件。
smart-open
open
s3
ftp
http
比如说
from smart_open import open import json with open("s3://your_bucket/your_key.json", 'r') as f: data = json.load(f)
Aws 凭证是通过 Boto3的证件加载的,通常是 ~/.aws/目录或环境变量中的一个文件。
~/.aws/
您可以使用下面的代码来编写,例如2019年的 S3图像。为了能够连接到 S3,您必须使用命令 pip install awscli安装 AWS CLI,然后使用命令 aws configure输入一些凭据:
pip install awscli
aws configure
import urllib3 import uuid from pathlib import Path from io import BytesIO from errors import custom_exceptions as cex BUCKET_NAME = "xxx.yyy.zzz" POSTERS_BASE_PATH = "assets/wallcontent" CLOUDFRONT_BASE_URL = "https://xxx.cloudfront.net/" class S3(object): def __init__(self): self.client = boto3.client('s3') self.bucket_name = BUCKET_NAME self.posters_base_path = POSTERS_BASE_PATH def __download_image(self, url): manager = urllib3.PoolManager() try: res = manager.request('GET', url) except Exception: print("Could not download the image from URL: ", url) raise cex.ImageDownloadFailed return BytesIO(res.data) # any file-like object that implements read() def upload_image(self, url): try: image_file = self.__download_image(url) except cex.ImageDownloadFailed: raise cex.ImageUploadFailed extension = Path(url).suffix id = uuid.uuid1().hex + extension final_path = self.posters_base_path + "/" + id try: self.client.upload_fileobj(image_file, self.bucket_name, final_path ) except Exception: print("Image Upload Error for URL: ", url) raise cex.ImageUploadFailed return CLOUDFRONT_BASE_URL + id
经过调查,我发现了这个。它可以通过使用一个简单的 csv 编写器来实现。它是写一个字典到 CSV 直接到 S3桶。
例如: data _ dict = [{“ Key1”: “ value1”,“ Key2”: “ value2”} ,{“ Key1”: “ value4”,“ Key2”: “ value3”}] 假设所有字典中的键都是统一的。
import csv import boto3 # Sample input dictionary data_dict = [{"Key1": "value1", "Key2": "value2"}, {"Key1": "value4", "Key2": "value3"}] data_dict_keys = data_dict[0].keys() # creating a file buffer file_buff = StringIO() # writing csv data to file buffer writer = csv.DictWriter(file_buff, fieldnames=data_dict_keys) writer.writeheader() for data in data_dict: writer.writerow(data) # creating s3 client connection client = boto3.client('s3') # placing file to S3, file_buff.getvalue() is the CSV body for the file client.put_object(Body=file_buff.getvalue(), Bucket='my_bucket_name', Key='my/key/including/anotherfilename.txt')