เปิดวัตถุ S3 เป็นสตริงด้วย Boto3


149

ฉันทราบว่าด้วย Boto 2 เป็นไปได้ที่จะเปิดวัตถุ S3 เป็นสตริงด้วย: get_contents_as_string()

มีฟังก์ชั่นที่เทียบเท่าใน boto3 หรือไม่?


8
ฉันหมายถึงเลือกคำตอบสุดท้ายโดยเฉพาะอย่างยิ่งของฉัน;)
EvgenyKolyakov

คำตอบ:


228

readจะกลับไบต์ อย่างน้อยสำหรับ Python 3 หากคุณต้องการส่งคืนสตริงคุณต้องถอดรหัสโดยใช้การเข้ารหัสที่ถูกต้อง:

import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8') 

1
เพื่อให้ได้คำตอบในการทำงานฉันต้องทำimport botocoreตามobj.get()['Body']แบบ<class 'botocore.response.StreamingBody'>
Tzunghsing David Wong

1
@TzunghsingDavidWong คุณไม่ควรนำเข้าแพ็คเกจเพื่อเรียกใช้วิธีการกับวัตถุที่มีอยู่ใช่ไหม? นั่นอาจเป็นสิ่งจำเป็นเท่านั้นในขณะทำการทดลอง?
Ken Williams

1
ค่าของคีย์ใน obj = s3.Object (bucket, key) ** bucket คือ buckername ?? และที่สำคัญคือชื่อไฟล์ ??? *** โปรดแก้ไขให้ถูกต้องหากฉันผิด ...
Amaresh Jana

1
@maresh ใช่ bucket = ชื่อ bucket และ key = filename
Tipster

หากคีย์เป็นรูปแบบ pdf จะใช้งานได้หรือไม่ หรือโปรดแนะนำวิธีที่มีประโยชน์อื่นฉันลองนำเข้า textract text = textract.process ('path / to / a.pdf', method = 'pdfminer') มันจะหว่านข้อผิดพลาดในการนำเข้า
Arun Kumar

96

ฉันมีปัญหาในการอ่าน / แยกวิเคราะห์วัตถุจาก S3 เนื่องจาก.get()ใช้ Python 2.7 ใน AWS Lambda

ฉันเพิ่ม json ในตัวอย่างเพื่อแสดงว่าแยกวิเคราะห์ได้ :)

import boto3
import json

s3 = boto3.client('s3')

obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())

หมายเหตุ (สำหรับ python 2.7): วัตถุของฉันคือ ascii ทั้งหมดดังนั้นฉันไม่ต้องการ .decode('utf-8')

หมายเหตุ (สำหรับ python 3.6+): เราย้ายไปที่ python 3.6 และค้นพบว่าread()ตอนนี้จะกลับมาbytesดังนั้นถ้าคุณต้องการที่จะได้รับสตริงจากมันคุณต้องใช้:

j = json.loads(obj['Body'].read().decode('utf-8'))


18
ทำงานให้ฉัน! เอกสาร AWS Boto3 ไม่เป็นระเบียบ
Timo

76

นี่ไม่ได้อยู่ในเอกสาร boto3 สิ่งนี้ใช้ได้กับฉัน:

object.get()["Body"].read()

วัตถุที่เป็นวัตถุ s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object


1
สมมติว่า "Body" มีข้อมูลสตริงคุณสามารถใช้ object.get () ["Body"]. read () เพื่อแปลงเป็นสตริง Python
roehrijn

28
boto3 ได้รับเอกสารแย่มากตั้งแต่ปี 2559
Andrew_1510

3
boto3.readthedocs.io/th/latest/reference/services/ ......บอกเราว่าค่าส่งคืนเป็น dict ด้วยคีย์ "ร่างกาย" ของประเภท StreamingBody ค้นหาว่าในการอ่านเอกสารจะทำให้คุณbotocore.readthedocs.io/ en / latest / reference / response.htmlซึ่งจะบอกให้คุณใช้ read ()
jeffrey

3
get expected at least 1 arguments, got 0ดูเหมือนว่าตอนนี้ ลบget()และเข้าถึงคุณสมบัติวัตถุ "ร่างกาย" โดยตรง
lurscher

13

Python3 + การใช้วิธีการ boto3 API

โดยการใช้S3.Client.download_fileobj APIและวัตถุคล้ายไฟล์ Pythonเนื้อหา S3 วัตถุสามารถเรียกคืนไปยังหน่วยความจำ

เนื่องจากเนื้อหาที่ดึงมาคือไบต์เพื่อที่จะแปลงเป็นstrจึงจำเป็นต้องถอดรหัส

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.