개요
2023.01.21 - [boto3] S3 Select - OverMaxRecordSize 에러 대안에서 S3에 저장된 데이터를 읽는 방법에 대해 소개했는데, 이 글에서는 JSON이나 CSV가 아니라 일반 텍스트 객체를 읽어 들여보려고 한다.
Pandas를 이용한 JSON, CSV 객체를 읽는 방법도 같이 적어둔다.
일반 객체 읽기
S3 객체에 대해 GET을 수행하면 응답의 Body 속성이 객체 데이터에 해당한다. Body 속성은 botocore.response.SteamingBody 클래스로, read() 함수를 이용하여 Byte 데이터를 얻을 수 있다. 문자열로 변경하고 싶다면 utf-8 등으로 캐릭터 셋을 변경한다.
객체 데이터는 client, resource를 사용하여 읽어들일 수 있다.
Client
import boto3
import botocore
client = boto3.client('s3')
def read_object(bucket, key, client=client):
obj = client.Object(bucket, key)
obj_body = obj['Body'].read().decode('utf-8')
return obj_body
Resource
import boto3
import botocore
resource = boto3.resource('s3')
def read_object(bucket, key, resource=resource):
obj = resource.Object(bucket, key)
obj_body = obj.get()['Body'].read().decode('utf-8')
return obj_body
AWS CLI로 따지면 아래의 명령어를 실행하여 OUTPUT_PATH의 파일을 읽는 것과 같다.
aws s3api get-object \
--bucket <BUCET_NAME> \
--key <OJECT_KEY> <OUTPUT_PATH>
CSV 읽기
Pandas가 제공하는 read_csv, read_json 함수는 Pandas가 동작하는 시스템 내에 위치한 파일뿐만 아니라 URL을 통해서 데이터를 읽을 수 있고, compression 매개변수를 이용하면 특정 방식으로 압축된 데이터 또한 읽을 수 있다. compression 매개변수에는 'zip', 'gzip', 'bz2', 'zstd', 'tar'를 지정할 수 있다.
import pandas as pd
bucket = 'bucket name'
data_key = 'data key'
data_location = f's3://{bucket}/{data_key}'
# CSV
data = pd.read_csv(data_location)
# 압축 파일인 경우
data = pd.read_csv(data_location, compression='gzip')
JSON 읽기
import pandas as pd
bucket = 'bucket name'
data_key = 'data key'
data_location = f's3://{bucket}/{data_key}'
# JSON
data = pd.read_json(data_location, lines=True|False)
# 압축 파일인 경우
data = pd.read_json(data_location, compression='gzip', lines=True|False)
참고 문서
https://stackoverflow.com/questions/36205481/read-file-content-from-s3-bucket-with-boto3
https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.get