Extrayendo archivos tar de un bucket de S3 a otro bucket de S3 utilizando Python
Necesitamos extraer el contenido de archivos zip y tar a otro bucket de S3.
Ya tenemos el código para extraer los archivos zip funcionando.
Necesitamos usar meta.client.upload_fileobj o meta.client.copy para utilizar subida múltiple o copia si es necesario.
def descomprimir_archivo(nombre_bucket_origen, nombre_archivo, nombre_bucket_destino):
s3_resource = boto3.resource('s3')
s3_client = boto3.client('s3')
directorio_destino = nombre_archivo + '/'
objeto_zip = s3_resource.Object(
bucket_name=nombre_bucket_origen, key=nombre_archivo)
buffer = BytesIO(objeto_zip.get()["Body"].read())
with zipfile.ZipFile(buffer, mode='r', allowZip64=True) as z:
for nombre_archivo in z.namelist():
informacion_archivo = z.getinfo(nombre_archivo)
s3_resource.meta.client.upload_fileobj(
z.open(nombre_archivo),
Bucket=nombre_bucket_destino,
Key=f'{nombre_archivo}/{nombre_archivo}'
)
No podemos hacer que la extracción de archivos tar funcione.
def descomprimir_tar(nombre_bucket_origen, nombre_archivo, nombre_bucket_destino):
s3_resource = boto3.resource('s3')
s3_client = boto3.client('s3')
directorio_destino = nombre_archivo + '/'
objeto_s3 = s3_client.get_object(Bucket=nombre_bucket_origen, Key=nombre_archivo)
archivo_tar = objeto_s3['Body'].read()
objeto_archivo = io.BytesIO(archivo_tar)
with tarfile.open(fileobj=objeto_archivo, mode=('r:gz')) as z:
for nombre_archivo in z.getmembers():
s3_resource.meta.client.upload_fileobj(
nombre_archivo, #z.open(nombre_archivo)
Bucket=nombre_bucket_destino,
Key=f'{nombre_archivo}/{nombre_archivo}'
)
El problema es especificar el objeto del nombre de archivo en el comando meta.client.upload_fileobj.
Hemos probado con z.open(nombre_archivo)
Agradeceríamos mucho si alguien tiene alguna idea.
davy.ai
Parece que el problema con la función
untar_file
es que la variablefilename
que se utiliza en la llamada aupload_fileobj
es un objetoTarInfo
en lugar de los contenidos del archivo. Para solucionarlo, puedes utilizar el métodoextractfile
del objetoTarFile
para obtener un objeto similar a un archivo para cada archivo en el archivo tar.Aquí tienes una versión actualizada de la función
untar_file
:En esta versión actualizada, utilizamos el método
isfile
de cada objetoTarInfo
para omitir directorios y otras entradas que no sean archivos en el archivo tar. Luego, utilizamos el métodoextractfile
para obtener un objeto similar a un archivo para el archivo actual, que podemos pasar aupload_fileobj
para cargarlo en S3. Ten en cuenta que también modificamos el parámetroKey
para utilizar la variabletarget_directory
, que establecimos anteriormente como el nombre del directorio que contiene el archivo tar.