Чтение файла JSON из S3 с использованием Python boto3

Я продолжал следить за JSON в тесте S3 'test'

{
  'Details' : "Something" 
}

Я использую следующий код, чтобы прочитать этот JSON и распечатать ключ "Подробности"

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'])

И я получаю ошибку, поскольку строковые индексы 'должны быть целыми числами Я не хочу загружать файл с S3, а затем читать.

Ответ 1

Как указано в комментариях выше, repr необходимо удалить, а файл json должен использовать двойные кавычки для атрибутов. Используя этот файл на aws/s3:

{
  "Details" : "Something"
}

и следующий код Python, он работает:

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

Ответ 2

Следующее сработало для меня.

# read_s3.py
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 

Для лучшей практики не рекомендуется напрямую кодировать AWS Id & Secret Keys. Вы можете рассмотреть любой из следующих:

(1) Считайте свои учетные данные AWS из файла json, хранящегося в вашем локальном хранилище:

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']
                     )

(2) Читайте из вашей переменной среды:

import os
client = boto3.client('s3',
                       aws_access_key_id=os.environ['MY_AWS_KEY_ID'],
                       aws_secret_access_key=os.environ['MY_AWS_SECRET_ACCESS_KEY']
                     )

Допустим, у нас есть сценарий оболочки для установки переменной среды следующим образом:

# set_env.sh
export MY_AWS_KEY_ID='YOUR_AWS_ACCESS_KEY_ID'
export MY_AWS_SECRET_ACCESS_KEY='YOUR_AWS_SECRET_ACCESS_KEY'
# execute the python file containing your code as stated above that reads from s3
python read_s3.py

Чтобы настроить вашу среду и выполнить ваш read_s3.py вместе, вы можете запустить скрипт оболочки в своем терминале следующим образом:

sh set_env.sh

Ответ 3

Я застрял на некоторое время, так как декодирование не работает для меня (s3 объекты сжаты).

Нашел это обсуждение, которое мне помогло: Python gzip: есть ли способ распаковать из строки?

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)

Если вы напечатаете jsonData, вы увидите нужный файл JSON! Если вы запускаете тестирование в самом AWS, обязательно проверяйте журналы CloudWatch, так как в лямбде он не будет выводить полный JSON файл, если он слишком длинный.