aws - Leyendo un archivo JSON desde S3 usando Python boto3
install boto3 (3)
Seguí siguiendo a JSON en el ''test'' de S3 bucket.
{
''Details'' : "Something"
}
Estoy usando el siguiente código para leer este JSON e imprimir la clave ''Detalles''
s3 = boto3.resource(''s3'',
aws_access_key_id=<access_key>,
aws_secret_access_key=<secret_key>
)
content_object = s3.Object(''test'', ''sample_json.txt'')
file_content = content_object.get()[''Body''].read().decode(''utf-8'')
json_content = json.loads(repr(file_content))
print(json_content[''Details''])
Y me aparece un error porque "los índices de cadena deben ser enteros" No quiero descargar el archivo desde S3 y luego leerlo.
Como se mencionó en los comentarios anteriores, repr
debe eliminarse y el archivo json
debe usar comillas dobles para los atributos. Usando este archivo en aws / s3:
{
"Details" : "Something"
}
y el siguiente código de Python, funciona:
import boto3
import json
s3 = boto3.resource(''s3'')
content_object = s3.Object(''test'', ''sample_json.txt'')
file_content = content_object.get()[''Body''].read().decode(''utf-8'')
json_content = json.loads(file_content)
print(json_content[''Details''])
# >> Something
Lo siguiente funcionó para mí.
import boto3
BUCKET = ''MY_S3_BUCKET_NAME''
FILE_TO_READ = ''FOLDER_PATH/my_file.json''
client = boto3.client(''s3'',
aws_access_key_id=''MY_AWS_KEY_ID'',
aws_secret_access_key=''MY_AWS_SECRET_ACCESS_KEY''
)
result = client.get_object(Bucket=BUCKET, Key=FILE_TO_READ)
text = result["Body"].read().decode()
print(text[''Details'']) # Use your desired JSON Key for your value
Para las mejores prácticas, no es una buena idea codificar directamente las claves secretas y de identificación de AWS. Puede leer sus credenciales de AWS desde un archivo json almacenado en su almacenamiento local como se muestra a continuación:
import json
credentials = json.load(open(''aws_cred.json''))
client = boto3.client(''s3'',
aws_access_key_id=credentials[''MY_AWS_KEY_ID''],
aws_secret_access_key=credentials[''MY_AWS_SECRET_ACCESS_KEY'']
)
Me quedé un poco atascado porque la decodificación no me funcionó (los objetos s3 están comprimidos).
Encontré esta discusión que me ayudó: Python gzip: ¿hay una manera de descomprimir desde una cadena?
import boto3
import zlib
key = event["Records"][0]["s3"]["object"]["key"]
bucket_name = event["Records"][0]["s3"]["bucket"]["name"]
s3_object = S3_RESOURCE.Object(bucket_name, key).get()[''Body''].read()
jsonData = zlib.decompress(s3_object, 16+zlib.MAX_WBITS)
Si imprime jsonData, verá el archivo JSON deseado. Si está ejecutando la prueba en AWS, asegúrese de verificar los registros de CloudWatch ya que en lambda no generará un archivo JSON completo si es demasiado largo.