es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuál es el equivalente de boto3 de aws s3 ls?

Estoy intentando replicar el comando aws s3 ls s3://bucket/prefix/ usando boto3. Actualmente, soy capaz de obtener todos los objetos dentro de la ruta con el siguiente código:

s3 = boto3.client('s3')
bucket = "my-bucket"
prefix = "my-prefix"
paginator = s3.get<em>paginator('list</em>objects<em>v2')
page</em>iterator = paginator.paginate(Bucket=bucket, Prefix = prefix)

Después, puedo iterar a través de page_iterator y reconstruir manualmente los directorios de nivel superior dentro de esa ruta. Sin embargo, dado que hay una gran cantidad de objetos dentro de la ruta, recuperar todos los objetos para reconstruir los resultados de este comando me lleva aproximadamente 30 segundos, mientras que el comando AWS CLI es casi instantáneo. ¿Hay una manera más eficiente de hacer esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, existe una forma más eficiente de replicar el comando aws s3 ls s3://bucket/prefix/ utilizando boto3. En lugar de usar list_objects_v2, puedes usar list_objects con el parámetro Delimiter establecido en /. Esto devolverá solamente los directorios de nivel superior dentro del prefijo especificado, lo cual es equivalente a la salida del comando ls. Aquí hay un ejemplo de código:

    s3 = boto3.client('s3')
    bucket = "mi-bucket"
    prefix = "mi-prefijo"
    
    response = s3.list_objects(Bucket=bucket, Prefix=prefix, Delimiter='/')
    
    for content in response.get('CommonPrefixes', []):
       print("Directorio:" + content.get('Prefix'))
    

    Este código devolverá solamente los directorios de nivel superior dentro del prefijo especificado, al igual que el comando aws s3 ls s3://bucket/prefix/. Esto reducirá significativamente el tiempo que le toma recuperar los resultados.

Comments are closed.