Boto 2 ile bir S3 nesnesini bir dize olarak açmak mümkün olduğunu biliyorum: get_contents_as_string()
Boto3'te eşdeğer bir işlev var mı?
Boto 2 ile bir S3 nesnesini bir dize olarak açmak mümkün olduğunu biliyorum: get_contents_as_string()
Boto3'te eşdeğer bir işlev var mı?
Yanıtlar:
read
bayt döndürecektir. En azından Python 3 için, bir dize döndürmek istiyorsanız, doğru kodlamayı kullanarak kod çözmeniz gerekir:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
.get()
Bir AWS Lambda içinde Python 2.7 kullanarak S3 nesneyi okumak / ayrıştırmak için bir sorun vardı .
Örneğe parsable olduğunu göstermek için json ekledim :)
import boto3
import json
s3 = boto3.client('s3')
obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())
NOT (python 2.7 için): Nesnem tamamen ascii, bu yüzden gerek yok .decode('utf-8')
NOT (python 3.6+ için): Python 3.6'ya taşındık ve read()
şimdi geri döndüğünü keşfettik, bytes
böylece bir dize almak istiyorsanız, şunu kullanmalısınız:
j = json.loads(obj['Body'].read().decode('utf-8'))
Bu boto3 belgelerinde yoktur. Bu benim için çalıştı:
object.get()["Body"].read()
nesne bir s3 nesnesi: http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object
get expected at least 1 arguments, got 0
. get()
"Body" nesnesi özelliğini doğrudan kaldırın ve erişin
Python3 + Boto3 API yaklaşımını kullanma.
Kullanarak S3.Client.download_fileobj API ve Python dosyasını benzeri bir nesne , S3 Nesne içeriği hafızasına alınabilir.
Alınan içerik bayt olduğundan, str'ye dönüştürmek için kodunun çözülmesi gerekir.
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
Gövde bir io.StringIO içeriyorsa, aşağıdakileri yapmanız gerekir:
object.get()['Body'].getvalue()
import botocore
gibiobj.get()['Body']
<class 'botocore.response.StreamingBody'>