Tôi biết rằng với Boto 2, có thể mở một đối tượng S3 dưới dạng một chuỗi với: get_contents_as_string()
Có một chức năng tương đương trong boto3?
Tôi biết rằng với Boto 2, có thể mở một đối tượng S3 dưới dạng một chuỗi với: get_contents_as_string()
Có một chức năng tương đương trong boto3?
Câu trả lời:
read
sẽ trả về byte. Ít nhất là đối với Python 3, nếu bạn muốn trả về một chuỗi, bạn phải giải mã bằng cách sử dụng mã hóa đúng:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
import botocore
làm obj.get()['Body']
là loại<class 'botocore.response.StreamingBody'>
Tôi gặp vấn đề khi đọc / phân tích đối tượng từ S3 vì .get()
sử dụng Python 2.7 trong AWS Lambda.
Tôi đã thêm json vào ví dụ để hiển thị nó có thể phân tích được :)
import boto3
import json
s3 = boto3.client('s3')
obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())
LƯU Ý (đối với python 2.7): Đối tượng của tôi là tất cả ascii, vì vậy tôi không cần .decode('utf-8')
LƯU Ý (đối với python 3.6+): Chúng tôi đã chuyển sang python 3.6 và phát hiện ra rằng read()
bây giờ trả về bytes
vì vậy nếu bạn muốn lấy một chuỗi ra khỏi nó, bạn phải sử dụng:
j = json.loads(obj['Body'].read().decode('utf-8'))
Đây không phải là tài liệu boto3. Điều này làm việc cho tôi:
object.get()["Body"].read()
đối tượng là một đối tượng s3: http://boto3.readthedocs.org/en/latest/reference/service/s3.html#object
get expected at least 1 arguments, got 0
. Xóa get()
và truy cập trực tiếp vào thuộc tính đối tượng "Cơ thể"
Python3 + Sử dụng phương pháp API boto3.
Bằng cách sử dụng S3.Client.doad_fileobj API và đối tượng giống như tệp Python , nội dung Đối tượng S3 có thể được truy xuất vào bộ nhớ.
Vì nội dung được truy xuất là byte, để chuyển đổi thành str , nó cần được giải mã.
import io
import boto3
client = boto3.client('s3')
bytes_buffer = io.BytesIO()
client.download_fileobj(Bucket=bucket_name, Key=object_key, Fileobj=bytes_buffer)
byte_value = bytes_buffer.getvalue()
str_value = byte_value.decode() #python3, default decoding is utf-8
Nếu cơ thể chứa io.StringIO, bạn phải làm như dưới đây:
object.get()['Body'].getvalue()