S3 nesnesini Boto3 ile dize olarak açma


Yanıtlar:


228

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

1
bu cevabı işe almak için, tip olduğu import botocoregibi obj.get()['Body']<class 'botocore.response.StreamingBody'>
yapmalıydım

1
@TzunghsingDavidWong, mevcut bir nesnede yöntemleri çağırmak için bir paketi içe aktarmak zorunda değilsiniz, değil mi? Bu sadece deneme yaparken gerekli miydi?
Ken Williams

1
obj = s3.Object (bucket, key) ** bucket içindeki anahtarın değeri nedir buckername? ve anahtar dosya adı ??? *** lütfen ben yanlış varsa beni düzeltin ...
Amaresh Jana

1
@Amaresh evet, kova = grup adı ve anahtar = dosya adı
Tipster

bir anahtar pdf formatında ise, işe yarıyor mu? ya da lütfen başka bir yararlı yol önermek, ithalat textract text = textract.process ('path / to / a.pdf', method = 'pdfminer') denedim.İthalat hatası ekecek
Arun Kumar

97

.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, bytesböylece bir dize almak istiyorsanız, şunu kullanmalısınız:

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


18
Benim için çalıştı! AWS Boto3 belgeleri bir karmaşa
Timo

76

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


1
"Gövde" nin dize verileri içerdiği varsayılarak, bir Python dizesine dönüştürmek için object.get () ["Gövde"]. read () kullanabilirsiniz.
roehrijn

28
boto3 2016 itibariyle korkunç doktor olsun.
Andrew_1510

3
boto3.readthedocs.io/tr/latest/reference/services/… bize dönüş değerinin bir diksiyon olduğunu söyler, StreamingBody türünde bir anahtar "Gövde" ile, dokümanı okumak için arama yapmak sizi botocore.readthedocs.io/ en / latest / reference / response.html read () komutunu kullanmanızı söyleyecektir.
jeffrey

3
şimdi öyle görünüyor get expected at least 1 arguments, got 0. get()"Body" nesnesi özelliğini doğrudan kaldırın ve erişin
lurscher

14

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

-5

Gövde bir io.StringIO içeriyorsa, aşağıdakileri yapmanız gerekir:

object.get()['Body'].getvalue()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.