Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

335
Vistas
Boto3 S3: Obtenga archivos sin obtener carpetas

Usando boto3, ¿cómo puedo recuperar todos los archivos en mi depósito S3 sin recuperar las carpetas?

Considere la siguiente estructura de archivos:

 file_1.txt folder_1/ file_2.txt file_3.txt folder_2/ folder_3/ file_4.txt

En este ejemplo solo estoy interesado en los 4 archivos.

EDITAR:

Una solución manual es:

 def count_files_in_folder(prefix): total = 0 keys = s3_client.list_objects(Bucket=bucket_name, Prefix=prefix) for key in keys['Contents']: if key['Key'][-1:] != '/': total += 1 return total

En este caso el total sería 4.

si acabo de hacer

 count = len(s3_client.list_objects(Bucket=bucket_name, Prefix=prefix))

el resultado serían 7 objetos (4 archivos y 3 carpetas):

 file.txt folder_1/ folder_1/file_2.txt folder_1/file_3.txt folder_1/folder_2/ folder_1/folder_2/folder_3/ folder_1/folder_2/folder_3/file_4.txt

Sólo quiero:

 file.txt folder_1/file_2.txt folder_1/file_3.txt folder_1/folder_2/folder_3/file_4.txt
about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

S3 es un ALMACÉN DE OBJETOS. NO almacena archivos/objetos en el árbol de directorios. Los recién llegados siempre confunden la opción de "carpeta" dada por ellos, que de hecho es un prefijo arbitrario para el objeto.

object PREFIX es una forma de recuperar su objeto organizado por una estructura predefinida de prefijo de nombre de archivo fijo (clave), por ejemplo, .

Puede imaginar usar un sistema de archivos que no le permite crear un directorio, pero le permite crear un nombre de archivo con una barra inclinada "/" o una barra invertida "\" como delimitador, y puede indicar el "nivel" del archivo por un prefijo común.

Por lo tanto, en S3, puede usar lo siguiente para "simular un directorio" que no es un directorio.

 folder1-folder2-folder3-myobject folder1/folder2/folder3/myobject folder1\folder2\folder3\myobject

Como puede ver, el nombre del objeto puede almacenarse dentro de S3 independientemente del tipo de separador de carpeta arbitrario (delimitador) que utilice.

Sin embargo, para ayudar al usuario a realizar transferencias masivas de archivos a S3, herramientas como aws cli, s3_transfer api intentan simplificar el paso y crear un nombre de objeto que siga la estructura de la carpeta local de entrada.

Entonces, si está seguro de que todo el objeto S3 está usando / o \ como separador, puede usar herramientas como S3transfer o AWSCcli para hacer una descarga simple usando el nombre de la clave.

Aquí está el código rápido y sucio usando el iterador de recursos. El uso de s3.resource.object.filter devolverá un iterador que no tiene el mismo límite de 1000 claves que list_objects()/list_objects_v2().

 import os import boto3 s3 = boto3.resource('s3') mybucket = s3.Bucket("mybucket") # if blank prefix is given, return everything) bucket_prefix="/some/prefix/here" objs = mybucket.objects.filter( Prefix = bucket_prefix) for obj in objs: path, filename = os.path.split(obj.key) # boto3 s3 download_file will throw exception if folder not exists try: os.makedirs(path) except FileExistsError: pass mybucket.download_file(obj.key, obj.key)
about 4 years ago · Santiago Trujillo Denunciar

0

No hay carpetas en S3. Lo que tienes son cuatro archivos llamados:

 file_1.txt folder_1/file_2.txt folder_1/file_3.txt folder_1/folder_2/folder_3/file_4.txt

Esos son los nombres reales de los objetos en S3. Si lo que quieres es terminar con:

 file_1.txt file_2.txt file_3.txt file_4.txt

todos sentados en el mismo directorio en un sistema de archivos local, necesitaría manipular el nombre del objeto para eliminar solo el nombre del archivo. Algo como esto funcionaría:

 import os.path full_name = 'folder_1/folder_2/folder_3/file_4.txt' file_name = os.path.basename(full_name)

La variable file_name contendría 'file_4.txt' .

about 4 years ago · Santiago Trujillo Denunciar

0

Una forma de filtrar las carpetas es verificar el carácter final del objeto si está seguro de que ningún archivo termina en una barra inclinada:

 for object_summary in objects.all(): if object_summary.key[-1] == "/": continue
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda