Mở đối tượng S3 dưới dạng chuỗi với Boto3


Câu trả lời:


227

readsẽ 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') 

1
để có được câu trả lời này để làm việc, tôi phải import botocorelàm obj.get()['Body']là loại<class 'botocore.response.StreamingBody'>
Tzunghsing David Wong

1
@TzunghsingDavidWong bạn không cần phải nhập gói để gọi các phương thức trên một đối tượng hiện có, phải không? Điều đó có lẽ chỉ cần thiết trong khi thử nghiệm?
Ken Williams

1
giá trị của khóa trong obj = s3.Object (xô, khóa) ** xô là tên người dùng ?? và chìa khóa là tên tập tin ??? *** vui lòng sửa cho tôi nếu tôi sai ...
Amaresh Jana

1
@Amaresh có, xô = tên xô và khóa = tên tệp
Tipster

Nếu một khóa là định dạng pdf, nó có hoạt động không? hoặc vui lòng đề xuất một cách hữu ích khác, tôi đã thử nhập textract text = textract. process ('path / to / a.pdf', method = 'pdfminer') Nó sẽ gieo lỗi nhập
Arun Kumar

96

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ề bytesvì 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'))


18
Đã làm cho tôi! Tài liệu AWS Boto3 là ​​một mớ hỗn độn
Timo

76

Đâ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


1
giả sử "Body" chứa dữ liệu chuỗi, ou có thể sử dụng object.get () ["Body"]. read () để chuyển đổi thành chuỗi Python.
roehrijn

28
boto3 nhận được tài liệu khủng khiếp, kể từ năm 2016.
Andrew_1510

3
boto3.readthedocs.io/en/latest/reference/services/... cho chúng ta biết giá trị trả về là một dict, với một chìa khóa "Body" của loại StreamingBody, tìm kiếm rằng trong đọc các tài liệu được bạn botocore.readthedocs.io/ vi / mới nhất / tham khảo / phản hồi.html sẽ cho bạn sử dụng read ().
jeffrey

3
Có vẻ như hiện nay 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ể"
lurscher

13

Python3 + Sử dụng phương pháp API boto3.

Bằng cách sử dụng S3.Client.doad_fileobj APIđố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

-5

Nếu cơ thể chứa io.StringIO, bạn phải làm như dưới đây:

object.get()['Body'].getvalue()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.