Öffnen Sie das S3-Objekt als Zeichenfolge mit Boto3

149

Mir ist bewusst, dass es mit Boto 2 möglich ist, ein S3-Objekt als Zeichenfolge zu öffnen mit: get_contents_as_string()

Gibt es eine äquivalente Funktion in boto3?

Gahl Levy
quelle
8
Ich wollte eine endgültige Antwort wählen, vorzugsweise meine;)
EvgenyKolyakov

Antworten:

227

readgibt Bytes zurück. Zumindest für Python 3 müssen Sie, wenn Sie einen String zurückgeben möchten, mit der richtigen Codierung dekodieren:

import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8') 
Kamil Sindi
quelle
1
Um diese Antwort zum import botocoreobj.get()['Body']<class 'botocore.response.StreamingBody'>
Laufen
1
@TzunghsingDavidWong Sie sollten kein Paket importieren müssen, um Methoden für ein vorhandenes Objekt aufzurufen, oder? War das vielleicht nur beim Experimentieren nötig?
Ken Williams
1
Was ist der Wert des Schlüssels im Objekt obj = s3.Object (Bucket, Key) ** Bucket ist Buckername? und Schlüssel ist der Dateiname ??? *** Bitte korrigieren Sie mich, wenn ich falsch
liege
1
@Amaresh ja, Bucket = Bucket Name und Schlüssel = Dateiname
Tipster
Wenn ein Schlüssel im PDF-Format vorliegt, funktioniert er dann? oder schlagen Sie bitte einen anderen nützlichen Weg vor, ich habe versucht, textract text = textract.process ('path / to / a.pdf', method = 'pdfminer') zu importieren. Es wird Importfehler säen
Arun Kumar
96

Ich hatte ein Problem beim Lesen / Parsen des Objekts aus S3, da .get()Python 2.7 in einem AWS Lambda verwendet wurde.

Ich habe dem Beispiel json hinzugefügt, um zu zeigen, dass es analysierbar wurde :)

import boto3
import json

s3 = boto3.client('s3')

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

HINWEIS (für Python 2.7): Mein Objekt ist alles ASCII, daher brauche ich es nicht .decode('utf-8')

HINWEIS (für Python 3.6+): Wir sind zu Python 3.6 übergegangen und haben festgestellt, dass dies read()jetzt zurückkehrt. bytesWenn Sie also eine Zeichenfolge daraus ziehen möchten, müssen Sie Folgendes verwenden:

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

EvgenyKolyakov
quelle
18
Hat für mich gearbeitet! AWS Boto3 Dokumentation ist ein Chaos
Timo
76

Dies ist nicht in der boto3-Dokumentation enthalten. Das hat bei mir funktioniert:

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

Objekt ist ein S3-Objekt: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object

Gahl Levy
quelle
1
Unter der Annahme, dass "Body" String-Daten enthält, können Sie object.get () ["Body"]. read () verwenden, um in einen Python-String zu konvertieren.
Roehrijn
28
boto3 bekommen schreckliche doc, ab 2016.
Andrew_1510
3
boto3.readthedocs.io/en/latest/reference/services/… teilt uns mit, dass der Rückgabewert ein Diktat ist, mit einem Schlüssel "Body" vom Typ StreamingBody. Wenn Sie in read the docs danach suchen, gelangen Sie zu botocore.readthedocs.io/ de / latest / reference / response.html, die Sie auffordert, read () zu verwenden.
Jeffrey
3
scheint das jetzt get expected at least 1 arguments, got 0. Entfernen Sie die get()und greifen Sie direkt auf die
Objekteigenschaft
13

Python3 + Verwenden des Boto3-API-Ansatzes.

Durch die Verwendung von S3.Client.download_fileobj API und Python - Datei-ähnliches Objekt , S3 Objektinhalt kann auf dem Speicher abgerufen werden.

Da es sich bei dem abgerufenen Inhalt um Bytes handelt, muss er zum Konvertieren in str dekodiert werden.

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
Gatsby Lee
quelle
-5

Wenn body ein io.StringIO enthält, müssen Sie wie folgt vorgehen:

object.get()['Body'].getvalue()
Pyglouthon
quelle