python/기초

[python 기초] bytesIO를 메모리로 읽어서 해체하자.

끼발자 2021. 10. 12. 15:31
반응형

s3에서 로컬 다운로드없이 파일을  읽으려고한다.

s3가 아니더라도, bytes 형태를 이미지로 바꿔보자


cat.png

귀여운 고양이사진이다.

s3에 이 사진이 있다고 가정하고, bytes로 읽어보자.

boto3가 설치되어있다는 가정 하에 진행하면,

우선 s3에 접속해야한다.

 

s3 = boto3.resource(aws_access_key_id = 'YOUR_KEY',
					aws_secret_access_key = 'YOUR_SECRET_KEY',
                    #endpoint_url='https://kr.object.ncloudstorage.com',
                    #정말 만약에 ncp를 사용하고있다면, 위의 주석을 해제하자
					service_name = 's3')

bucket = s3.Bucket('your_bucket')

 

제대로 입력했다면 에러없이 정상적으로 진행 될 것이다.

s3 버킷 내에 있는 오브젝트를 확인하고싶다면,

다음과 같이 코드를 작성하자.

obj = bucket.objects.filter(Prefix = Your_Keyword)
file_list = []
for i in obj:
    if i.endswith('/'):
        continue
    file_list.append(i.key)

 

파일들이  file_list에 담기게된다.

이제 이 파일을 메모리로 읽어보자.

 

import io
file = io.BytesIO()

bucket_obj = bucket.Object(file_name)
bucket_obj.download_fileobj(file)

file 변수 안에 s3 오브젝트를 다운로드했다.

 

만약 s3가 아닌 로컬에 있는 사진을 bytes로 읽으려면 

with open('cat.png','r') as f:
	file = f.read()

로 간단하게 읽을 수 있다.

1. cv2

import cv2
import numpy as np

file.seek(0)
img_file = np.fromstring(file.read(),np.uint8)
img = cv2.imdecode(img_file,cv2.IMREAD_COLOR)

 

2. PIL

from PIL import Image

file.seek()
pil_image = Image.open(file)

 

cv2는 numpy형태로 저장되고, PIL은 pil_image.show() 명령어를 통해 이미지 출력이 가능하니

목적에 맞게 사용하자.

반응형