Öffnen Sie das S3-Objekt als Zeichenfolge mit Boto3


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

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


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


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

-5

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

object.get()['Body'].getvalue()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.