Zdaję sobie sprawę, że za pomocą Boto 2 można otworzyć obiekt S3 jako string z: get_contents_as_string()
Czy istnieje równoważna funkcja w boto3?
Zdaję sobie sprawę, że za pomocą Boto 2 można otworzyć obiekt S3 jako string z: get_contents_as_string()
Czy istnieje równoważna funkcja w boto3?
Odpowiedzi:
read
zwróci bajty. Przynajmniej dla Pythona 3, jeśli chcesz zwrócić ciąg, musisz zdekodować przy użyciu odpowiedniego kodowania:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
import botocore
co obj.get()['Body']
jest typu<class 'botocore.response.StreamingBody'>
Miałem problem z odczytaniem / parsowaniem obiektu z S3 z powodu .get()
używania Pythona 2.7 wewnątrz AWS Lambda.
Dodałem json do przykładu, aby pokazać, że stał się parsowalny :)
import boto3
import json
s3 = boto3.client('s3')
obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())
UWAGA (dla Pythona 2.7): Mój obiekt to cały ascii, więc nie potrzebuję .decode('utf-8')
UWAGA (dla Pythona 3.6+): Przeszliśmy do Pythona 3.6 i odkryliśmy, że read()
teraz zwraca, bytes
więc jeśli chcesz uzyskać z niego ciąg, musisz użyć:
j = json.loads(obj['Body'].read().decode('utf-8'))
Tego nie ma w dokumentacji boto3. To zadziałało dla mnie:
object.get()["Body"].read()
obiekt będący obiektem s3: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
get expected at least 1 arguments, got 0
. Usuń get()
i
Python3 + Korzystanie z podejścia boto3 API.
Korzystając z interfejsu API S3.Client.download_fileobj i obiektu przypominającego plik w języku Python , zawartość obiektu S3 można pobrać do pamięci.
Ponieważ pobrana treść to bajty, aby przekonwertować ją na str , należy ją zdekodować.
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
Jeśli body zawiera io.StringIO, musisz wykonać poniższe czynności:
object.get()['Body'].getvalue()