Determine si la carpeta o la clave de archivo – Boto

Utilizando boto y Python estoy tratando de diferenciar si una clave está devolviendo una carpeta de archivo (soy consciente de que S3 trata exactamente lo mismo que no estoy tratando con un sistema de archivos directamente).

Lo que tengo en este momento son 2 llaves.

  

El primero es una “Carpeta” y el segundo es un “Archivo”. Lo que me gustaría hacer es determinar si la clave es un “Archivo” pero no estoy seguro de cómo determinar esto, lo obvio es que la clave no termina en un / pero cómo lo determinaría en Python.

Si estaba iterando sobre una list() ¿puedo convertir la clave en una cadena o acceder a los atributos de las claves?

 for obj in srcBucket.list(): # Get the Key object of the given key, in the bucket k = Key(srcBucket, obj.key) print(k)   

Usted es correcto que las carpetas no existen. Por ejemplo, puede crear un archivo llamado output/2020/01/01/foo.txt incluso si no existe ninguna de estas subcarpetas.

Sin embargo, a algunos sistemas les gusta ‘crear’ una carpeta haciendo un objeto de longitud cero con el nombre de la carpeta pretendida. En tales casos, puede identificar la ‘carpeta’ verificando la longitud del objeto.

Aquí hay algunos ejemplos de código (usando el método del cliente boto3):

 import boto3 s3 = boto3.client('s3', region_name = 'ap-southeast-2') response = s3.list_objects_v2(Bucket='my-bucket') for object in response['Contents']: if object['Size'] == 0: # Print name of zero-size object print(object['Key']) 

Oficialmente, no hay razón para que existan tales ‘archivos de carpeta’. Amazon S3 funcionará perfectamente bien sin ellos (y, a menudo, mejor, ¡por las razones que descubres!).