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?
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?
Antworten:
read
gibt 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')
import botocore
obj.get()['Body']
<class 'botocore.response.StreamingBody'>
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. bytes
Wenn Sie also eine Zeichenfolge daraus ziehen möchten, müssen Sie Folgendes verwenden:
j = json.loads(obj['Body'].read().decode('utf-8'))
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
get expected at least 1 arguments, got 0
. Entfernen Sie die get()
und greifen Sie direkt auf die
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
Wenn body ein io.StringIO enthält, müssen Sie wie folgt vorgehen:
object.get()['Body'].getvalue()