Boto3을 사용하여 S3 객체를 문자열로 열기


답변:


228

read바이트를 반환합니다. 적어도 Python 3의 경우 문자열을 반환하려면 올바른 인코딩을 사용하여 디코딩해야합니다.

import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8') 

1
이 답변을 제대로 활용하려면 다음 import botocore과 같이 obj.get()['Body']입력해야합니다.<class 'botocore.response.StreamingBody'>
Tzunghsing David Wong

1
@TzunghsingDavidWong 기존 객체에서 메소드를 호출하기 위해 패키지를 가져올 필요가 없습니다. 실험하는 동안에 만 필요할까요?
Ken Williams

1
obj = s3.Object (bucket, key) ** 버킷의 키 값은 buckername입니까? 그리고 열쇠는 파일 이름입니까 ??? *** 만약 내가 틀렸다면 바로
잡아주세요

1
@Amaresh 예, 버킷 = 버킷 이름 및 키 = 파일 이름
Tipster

키가 pdf 형식 인 경우 작동합니까? 또는 다른 유용한 방법을 제안하십시오. import textract text = textract.process ( 'path / to / a.pdf', method = 'pdfminer') 가져 오기 오류가 발생합니다
Arun Kumar

96

.get()AWS Lambda에서 Python 2.7 을 사용 했기 때문에 S3에서 객체를 읽거나 구문 분석하는 데 문제가있었습니다 .

예제에 json을 추가하여 구문 분석 가능하게 표시했습니다. :)

import boto3
import json

s3 = boto3.client('s3')

obj = s3.get_object(Bucket=bucket, Key=key)
j = json.loads(obj['Body'].read())

참고 (파이썬 2.7의 경우) : 내 객체는 모두 ASCII이므로 필요하지 않습니다. .decode('utf-8')

참고 (파이썬 3.6 이상) : 우리는 파이썬 3.6으로 옮겼으며 read()이제 bytes문자열을 가져 오려면 다음을 사용해야 한다는 것을 발견했습니다 .

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


18
나를 위해 일했다! AWS Boto3 설명서는 엉망입니다
Timo

76

이것은 boto3 문서에 없습니다. 이것은 나를 위해 일했다 :

object.get()["Body"].read()

s3 객체 인 객체 : http://boto3.readthedocs.org/en/latest/reference/services/s3.html#object


1
"Body"에 문자열 데이터가 있다고 가정하면 object.get () [ "Body"]. read ()를 사용하여 Python 문자열로 변환 할 수 있습니다.
roehrijn

28
boto3는 2016
기준

3
boto3.readthedocs.io/en/latest/reference/services/… 반환 값이 dict이며 StreamingBody 유형의 "Body"키를 사용하여 문서에서 읽은 문서를 검색하면 botocore.readthedocs.io/ read /)를 사용하도록 알려주는 en / latest / reference / response.html
jeffrey

3
지금 보인다 get expected at least 1 arguments, got 0. 를 제거하고 get()"본문"개체 속성에 직접 액세스
lurscher

13

Python3 + boto3 API 접근법 사용.

S3.Client.download_fileobj APIPython 파일 유사 객체 를 사용하여 S3 객체 컨텐츠를 메모리로 검색 할 수 있습니다.

검색된 컨텐츠는 바이트이므로 str 로 변환 하려면이를 디코딩해야합니다.

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

body에 io.StringIO가 포함 된 경우 다음과 같이해야합니다.

object.get()['Body'].getvalue()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.