使用Python将tar文件从一个S3存储桶提取到另一个S3存储桶 [英] Extracting tar files from an S3 bucket to another S3 bucket using Python

查看:28
本文介绍了使用Python将tar文件从一个S3存储桶提取到另一个S3存储桶的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们需要将zip和tar文件的内容解压到另一个S3存储桶中。 我们有解压zip文件的代码。 我们需要使用meta.client.pload_fileobj或meta.client.copy,因此如果需要,将使用分部分上传或复制。

def unzip_file(source_bucketname, filename, target_bucketname):

    s3_resource = boto3.resource('s3')
    s3_client = boto3.client('s3')

    target_directory = source_file_name + '/'

    zip_obj = s3_resource.Object(
        bucket_name=source_bucketname, key=source_file_name)

    buffer = BytesIO(zip_obj.get()["Body"].read())

    with zipfile.ZipFile(buffer, mode='r', allowZip64=True) as z:
        for filename in z.namelist():
            file_info = z.getinfo(filename)

            s3_resource.meta.client.upload_fileobj(
                z.open(filename),
                Bucket=target_bucketname,
                Key=f'{source_file_name}/{filename}'
            )

我们无法使tar文件的提取正常工作。

def untar_file(source_bucketname, filename, target_bucketname):

    s3_resource = boto3.resource('s3')
    s3_client = boto3.client('s3')

    target_directory = source_file_name + '/'

    s3_object = s3_client.get_object(Bucket=source_bucketname, Key=filename)
    tar_file = s3_object['Body'].read()
    file_object = io.BytesIO(tar_file)

    with tarfile.open(fileobj=file_object, mode=('r:gz')) as z:
        for filename in z.getmembers():
            s3_resource.meta.client.upload_fileobj(
                filename, #z.open(filename)
                Bucket=target_bucketname,
                Key=f'{source_file_name}/{filename}'
            )
问题是在meta.client.pload_fileobj命令中指定文件名对象。 我们已尝试z.open(文件名)

如果有人有什么想法,我们将不胜感激。

推荐答案

匿名考沃德回答了此问题,但答案似乎已被删除。

s3_resource.meta.client.upload_fileobj(
        filename, #z.open(filename)
        Bucket=target_bucketname,
        Key=f'{source_file_name}/{filename}'
    )

需要

s3_resource.meta.client.upload_fileobj(
        z.extractfile(filename),
        Bucket=target_bucketname,
        Key=f'{source_file_name}/{filename.name}'
    )

源文件需要为z.提取tfile(Filename),目标文件名需要为filename.name。

非常感谢Anon Coward

这篇关于使用Python将tar文件从一个S3存储桶提取到另一个S3存储桶的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆