Сжатие файлов GZIP и boto3 - PullRequest
       114

Сжатие файлов GZIP и boto3

0 голосов
/ 07 ноября 2019

Я новичок в использовании boto3, и я хотел бы сжать файл, который находится в ведре s3, не загружая его на мой локальный ноутбук. Предполагается, что это потоковое сжатие (Glue aws). Здесь вы можете найти мои три попытки. Первый будет лучшим, потому что он, на мой взгляд, находится в потоке (похоже на функцию "gzip.open").

Первая неправильная попытка (gzip.s3.open не существует ...):

  with gzip.s3.open('s3://bucket/attempt.csv','wb') as fo: 
      "operations (write a file)"

Вторая неправильная попытка ( s3fs сжатие gzip на панде dataframe ):

import gzip
import boto3
from io import BytesIO, TextIOWrapper

s3 = boto3.client('s3', aws_access_key_id='', aws_secret_access_key='')

# read file
source_response_m = s3.get_object(Bucket=bucket,Key='file.csv')
df = pd.read_csv(io.BytesIO(source_response_m['Body'].read()))

# compress file
buffer = BytesIO()

with gzip.GzipFile(mode='w', fileobj=buffer) as zipped_file:
    df.to_csv(TextIOWrapper(zipped_file, 'utf8'), index=False)

# upload it
s3_resource = boto3.resource('s3',aws_access_key_id='', aws_secret_access_key='')
s3_object = s3_resource.Object(bucket, 'file.csv.gz')
s3_object.put(Body=buffer.getvalue())

Третья неправильная попытка ( Загрузка файла Gzip с использованием Boto3 & https://gist.github.com/tobywf/079b36898d39eeb1824977c6c2f6d51e)

from io import BytesIO
import gzip
import shutil
import boto3
from tempfile import TemporaryFile


s3 = boto3.resource('s3',aws_access_key_id='', aws_secret_access_key='')
bucket = s3.Bucket('bucket')


def upload_gzipped(bucket, key, fp, compressed_fp=None, content_type='text/plain'):
    """Compress and upload the contents from fp to S3.
    If compressed_fp is None, the compression is performed in memory.
    """
    if not compressed_fp:
        compressed_fp = BytesIO()
    with gzip.GzipFile(fileobj=compressed_fp, mode='wb') as gz:
        shutil.copyfileobj(fp, gz)
    compressed_fp.seek(0)
    bucket.upload_fileobj(compressed_fp, key, {'ContentType': content_type, 'ContentEncoding': 'gzip'})


upload_gzipped(bucket,'folder/file.gz.csv', 'file.csv.gz')

Честно говоря, я понятия не имею, как использовать последнюю попытку. Документ, который я нашел, не очень понятен и примеров нет.

Есть ли у вас какие-либо идеи / предложения по решению моей проблемы?

Заранее спасибо,

D

...