AWS는 파일을 S3에 저장하고, 아테나(ATHENA)로 쿼리를 날려 데이터를 조회하고 편집할 수 있는 구조를 가지고 있다. 아테나 쿼리는 속도도 빠르고, S3에 저장된 파일을 따로 접근할 수도 있어 사용해보면 생각보다 굉장히 편리하다. S3에는 그냥 일반 파일도 저장이 가능하다. S3에 저장한 파일을 읽고 쓰는 방법은 여러가지가 있다. 하지만, 잘 정리가 안 되어(?) 있는 것 같아 포스팅을 작성하기로 하였다. 오늘은 AWS python(파이썬) S3 파일 읽기 및 쓰기에 대해서 알아보도록 하겠다.

 

AWS S3 파일

 

 

1. 판다스(pandas) 데이터프레임으로 읽고 쓰기

판다스는 read_csv나 write_csv등 파일로 읽고 쓸 수 있는 함수들을 가지고 있다. 여기에 S3주소를 넣으면 그대로 파일을 읽고 쓸 수 있다.

예를 들면 아래와 같이 파케이 타입으로 바로 S3에 저장할 수 있다.

rls.to_parquet(f's3://{버킷이름}/{Key}', index=False)

 

처음에는 버킷과 폴더가 좀 혼동스러웠는데, 필자가 이해하기에는 그렇다. S3에 최상위 폴더는 버킷이고 그 뒤에서부터는 /를 붙여가며 Key가 된다.

판다스 데이터프레임으로 읽을 때도 read~ 함수를 이용해서 쉽게 사용할 수 있다.

rls.to_parquet(f's3://{버킷이름}/{Key}', index=False)

 

위의 예에서는 파케이를 들었지만, csv나 다른 함수들도 동일하게 사용할 수 있다. 파케이는 데이터를 저장하는 파일 포맷 중의 하나로, 컬럼 스토리지 형식의 포맷이라고 한다. 칼럼 기반이기 때문에, 압축률도 좋고 I/O 사용률도 줄어든다고 한다. 필자는 테이블 스키마를 별도로 지정할 필요가 없어서 좋은 것 같다.

 

 

Recommendation 포스팅

 

 

2. 그외 파일 읽기 및 쓰기

그외 파일도 open함수를 이용해서 사용할 수 있을 것 같지만, 그렇지 않다. 그외 파일을 읽고 쓰기 위해서는 boto3모듈을 이용해야 한다. boto3를 이용하면 S3를 비롯해서 대부분의 AWS 저장 데이터에 접근할 수 있다.

하지만 boto3를 이용해서 파일 내용을 읽기가 조금 까다로운데, 이 때는 S3의 파일을 SageMaker에 저장해서 사용하는 방법이 있다.

우선 S3 버킷에서 필요한 파일을 찾아야 하는데 아래 코드를 이용하면 찾을 수 있다.

table_nm = '찾고자 하는 파일 이름'

s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_nm)
file_list = [obj.key for obj in bucket.objects.all() if obj.key.find(table_nm)>-1]

 

gz으로 저장된 파일을 불러와서 tsv의 파일을 로컬로 저장하는 코드는 아래와 같다. 

tsv_file_name = '로컬 저장 파일 이름'

with open(tsv_file_name, "wb") as new_f:    
	for file in tqdm(file_list):
		obj = s3.Object(bucket_nm,file)    
		with gzip.GzipFile(fileobj=obj.get()["Body"]) as gzipfile:
			content = gzipfile.read()
		new_f.write(content)

 

혹은 aws cp와 같은 터미널 명령을 이용해서 파일을 불러 올 수도 있다.


gzip파일 외에 피클이나 일반 파일을 바로 읽고 싶다면 아래와 같이 하면 된다.

import boto3
import io

s3 = boto3.resource('s3')
obj = s3.Object("버킷 이름",f'키')    
fileobj=obj.get()["Body"].read()
file = io.BytesIO(fileobj)
temp = pickle.load(file)

 

 

오늘은 AWS python(파이썬) S3 파일 읽기 및 쓰기에 대해서 알아보았다. 필자의 블로그에는 그 외에도 파이썬 관련 재미있는 내용들이 많으니 한 번 구경해주기를 바란다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">