Module xingyun.cloud.awss3

This module helps easy use AWS S3.

Expand source code
'''
This module helps easy use AWS S3.
'''

import boto3
import tempfile
import pickle
from typing import Literal, Any
import blosc

class AWSS3:
    def __init__(self, key_id: str, key_sec: str, region: str, bucket: str):
        self.s3 = boto3.client("s3" , 
            region_name             = region ,
            aws_access_key_id       = key_id , 
            aws_secret_access_key   = key_sec , 
        )
        self.bucket = bucket

    def __del__(self):
        self.s3.close()

    def set(self, data: Any, tar_path: str, format: Literal["binary" , "str" , "pickle"] = "pickle"):
        '''Set the content of a remote file.

        ### Returns
            Return `True` if success, else return `False`.
        '''
        tar_path = str(tar_path).replace("\\"  , "/")

        if format == "str":
            try:
                data = bytes(str(data), encoding = "utf-8")
                with tempfile.TemporaryFile(mode = "wb+") as fil:
                    fil.write(data)
                    fil.seek(0,0) # 文件指针移动到开头
                    self.s3.upload_fileobj(fil , self.bucket , tar_path)
            except Exception:
                return False
        if format == "pickle":
            data = pickle.dumps(data)
            data = blosc.compress(data) # compress data

        if format == "pickle" or format == "pickle":
            try:
                with tempfile.TemporaryFile(mode = "wb+") as fil:
                    fil.write(data)
                    fil.seek(0,0) # 文件指针移动到开头
                    self.s3.upload_fileobj(fil , self.bucket , tar_path)
            except Exception:
                return False

        return True

    def get(self, tar_path: str, format: Literal["binary" , "str" , "pickle"] = "pickle") -> Any:
        '''Get the content of a remote file. 
        
        ### Returns
            Return `None` if fail.
        '''

        tar_path = str(tar_path).replace("\\"  , "/")
        data = None
        if format == "str":
            try:
                with tempfile.TemporaryFile(mode = "wb+") as fil:
                    self.s3.download_fileobj(self.bucket , tar_path, fil)
                    fil.seek(0,0) # 文件指针移动到开头
                    data = fil.read()
                    data = str(data, encoding = "utf-8")
            except Exception:
                return None
        if format == "pickle" or format == "bianry":
            try:
                with tempfile.TemporaryFile(mode = "wb+") as fil:
                    self.s3.download_fileobj(self.bucket , tar_path, fil)
                    fil.seek(0,0) # 文件指针移动到开头
                    data = fil.read()
                    if format == "pickle":
                        try:
                            data = blosc.decompress(data)
                        except: 
                            pass # not blosc compressed. do nothing
                        data = pickle.loads(data)
            except Exception:
                return None
        return data

Classes

class AWSS3 (key_id: str, key_sec: str, region: str, bucket: str)
Expand source code
class AWSS3:
    def __init__(self, key_id: str, key_sec: str, region: str, bucket: str):
        self.s3 = boto3.client("s3" , 
            region_name             = region ,
            aws_access_key_id       = key_id , 
            aws_secret_access_key   = key_sec , 
        )
        self.bucket = bucket

    def __del__(self):
        self.s3.close()

    def set(self, data: Any, tar_path: str, format: Literal["binary" , "str" , "pickle"] = "pickle"):
        '''Set the content of a remote file.

        ### Returns
            Return `True` if success, else return `False`.
        '''
        tar_path = str(tar_path).replace("\\"  , "/")

        if format == "str":
            try:
                data = bytes(str(data), encoding = "utf-8")
                with tempfile.TemporaryFile(mode = "wb+") as fil:
                    fil.write(data)
                    fil.seek(0,0) # 文件指针移动到开头
                    self.s3.upload_fileobj(fil , self.bucket , tar_path)
            except Exception:
                return False
        if format == "pickle":
            data = pickle.dumps(data)
            data = blosc.compress(data) # compress data

        if format == "pickle" or format == "pickle":
            try:
                with tempfile.TemporaryFile(mode = "wb+") as fil:
                    fil.write(data)
                    fil.seek(0,0) # 文件指针移动到开头
                    self.s3.upload_fileobj(fil , self.bucket , tar_path)
            except Exception:
                return False

        return True

    def get(self, tar_path: str, format: Literal["binary" , "str" , "pickle"] = "pickle") -> Any:
        '''Get the content of a remote file. 
        
        ### Returns
            Return `None` if fail.
        '''

        tar_path = str(tar_path).replace("\\"  , "/")
        data = None
        if format == "str":
            try:
                with tempfile.TemporaryFile(mode = "wb+") as fil:
                    self.s3.download_fileobj(self.bucket , tar_path, fil)
                    fil.seek(0,0) # 文件指针移动到开头
                    data = fil.read()
                    data = str(data, encoding = "utf-8")
            except Exception:
                return None
        if format == "pickle" or format == "bianry":
            try:
                with tempfile.TemporaryFile(mode = "wb+") as fil:
                    self.s3.download_fileobj(self.bucket , tar_path, fil)
                    fil.seek(0,0) # 文件指针移动到开头
                    data = fil.read()
                    if format == "pickle":
                        try:
                            data = blosc.decompress(data)
                        except: 
                            pass # not blosc compressed. do nothing
                        data = pickle.loads(data)
            except Exception:
                return None
        return data

Methods

def get(self, tar_path: str, format: Literal['binary', 'str', 'pickle'] = 'pickle') ‑> Any

Get the content of a remote file.

Returns

Return <code>None</code> if fail.
Expand source code
def get(self, tar_path: str, format: Literal["binary" , "str" , "pickle"] = "pickle") -> Any:
    '''Get the content of a remote file. 
    
    ### Returns
        Return `None` if fail.
    '''

    tar_path = str(tar_path).replace("\\"  , "/")
    data = None
    if format == "str":
        try:
            with tempfile.TemporaryFile(mode = "wb+") as fil:
                self.s3.download_fileobj(self.bucket , tar_path, fil)
                fil.seek(0,0) # 文件指针移动到开头
                data = fil.read()
                data = str(data, encoding = "utf-8")
        except Exception:
            return None
    if format == "pickle" or format == "bianry":
        try:
            with tempfile.TemporaryFile(mode = "wb+") as fil:
                self.s3.download_fileobj(self.bucket , tar_path, fil)
                fil.seek(0,0) # 文件指针移动到开头
                data = fil.read()
                if format == "pickle":
                    try:
                        data = blosc.decompress(data)
                    except: 
                        pass # not blosc compressed. do nothing
                    data = pickle.loads(data)
        except Exception:
            return None
    return data
def set(self, data: Any, tar_path: str, format: Literal['binary', 'str', 'pickle'] = 'pickle')

Set the content of a remote file.

Returns

Return <code>True</code> if success, else return <code>False</code>.
Expand source code
def set(self, data: Any, tar_path: str, format: Literal["binary" , "str" , "pickle"] = "pickle"):
    '''Set the content of a remote file.

    ### Returns
        Return `True` if success, else return `False`.
    '''
    tar_path = str(tar_path).replace("\\"  , "/")

    if format == "str":
        try:
            data = bytes(str(data), encoding = "utf-8")
            with tempfile.TemporaryFile(mode = "wb+") as fil:
                fil.write(data)
                fil.seek(0,0) # 文件指针移动到开头
                self.s3.upload_fileobj(fil , self.bucket , tar_path)
        except Exception:
            return False
    if format == "pickle":
        data = pickle.dumps(data)
        data = blosc.compress(data) # compress data

    if format == "pickle" or format == "pickle":
        try:
            with tempfile.TemporaryFile(mode = "wb+") as fil:
                fil.write(data)
                fil.seek(0,0) # 文件指针移动到开头
                self.s3.upload_fileobj(fil , self.bucket , tar_path)
        except Exception:
            return False

    return True