使用Python将tar文件从一个S3存储桶提取到另一个S3存储桶 [英] Extracting tar files from an S3 bucket to another S3 bucket using Python
本文介绍了使用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屋!
查看全文