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.

Obteniendo solo los objetos seleccionados de S3

s3=boto3.resource('s3')
bucket=s3.Bucket('***')
prefix_objs=bucket.objects.filter(Prefix='****')
body=[]
for obj in prefix_objs:
    print(obj.key())

Este fragmento de código no está devolviendo ninguna salida. Idealmente, quisiera leer varios archivos en diferentes dataframes.

La variable prefix_objs está devolviendo lo siguiente:
Colección de objetos de s3.Bucket.objectsCollection(s3.Bucket(name='****'), s3.ObjectSummary)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el bucle for solo está imprimiendo las claves de los objetos en el bucket que coinciden con el prefijo especificado, pero no está leyendo realmente el contenido de esos objetos. Para leer el contenido de los objetos y crear varios dataframes, deberías modificar el código a algo como esto:

    import pandas as pd
    import io
    
    s3 = boto3.client('s3')
    bucket_name = '***'
    prefix = '****'
    
    objects = s3.list_objects(Bucket=bucket_name, Prefix=prefix)['Contents']
    dfs = []
    
    for obj in objects:
        key = obj['Key']
        obj = s3.get_object(Bucket=bucket_name, Key=key)
        df = pd.read_csv(io.BytesIO(obj['Body'].read()), encoding='utf-8')
        dfs.append(df)
    

    Este código utilizará el cliente boto3 para listar todos los objetos en el bucket que coinciden con el prefijo especificado, luego los recorrerá, leerá cada uno como un archivo CSV y agregará los dataframes resultantes a una lista llamada dfs. Ten en cuenta que es posible que necesites ajustar el formato y la codificación del archivo en la llamada a pd.read_csv() según el formato real de los objetos en el bucket.

Comments are closed.