dynamodb aws python json amazon-web-services amazon-s3 boto3

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.