programing

Python boto3를 사용하여 S3에서 JSON 파일 읽기

shortcode 2023. 4. 3. 23:29
반응형

Python boto3를 사용하여 S3에서 JSON 파일 읽기

S3 버킷 '테스트'에서 JSON을 계속 따라다녔다.

{
  'Details' : "Something" 
}

다음 코드를 사용하여 이 JSON을 읽고 'Details' 키를 인쇄하고 있습니다.

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

그리고 'string index는 정수여야 한다'는 오류가 발생하며 S3에서 파일을 다운로드하여 읽고 싶지 않습니다.

위 댓글에서도 언급했듯이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

다음은 나에게 효과가 있었다.

# read_s3.py

from boto3 import client

BUCKET = 'MY_S3_BUCKET_NAME'
FILE_TO_READ = 'FOLDER_NAME/my_file.json'
client = 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 

한층 더 개선

위의 코드 스니펫을 다음과 같이 부릅니다.read_s3.py.

AWS Id & Secret Keys를 직접 하드코드 하는 것은 좋지 않습니다.베스트 프랙티스의 경우는, 다음의 어느쪽인가를 고려할 수 있습니다.

(1) json 파일에서 AWS 자격 증명을 읽습니다.aws_cred.json)는 로컬 스토리지에 저장됩니다.

from json import load
from boto3 import client
...
credentials = load(open('local_fold/aws_cred.json'))
client = client('s3',
                 aws_access_key_id=credentials['MY_AWS_KEY_ID'],
                 aws_secret_access_key=credentials['MY_AWS_SECRET_ACCESS_KEY']
                )

(2) 환경변수(도입에 있어서 내가 선호하는 옵션)를 읽어냅니다.

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

그럼 이제 셸 스크립트를 준비하겠습니다read_s3_using_env.sh환경변수 설정 및 python 스크립트 추가(read_s3.py)는 다음과 같습니다.

# read_s3_using_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 # will execute the python script to read from s3

다음으로 다음과 같이 단말기에서 셸 스크립트를 실행합니다.

sh read_s3_using_env.sh

추가하기를 원했습니다.botocore.response.streamingbody와 잘 어울린다json.load:

import json
import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
data = json.load(obj.get()['Body']) 

AWS Lambda에서 아래 코드를 사용하여 S3 버킷에서 JSON 파일을 읽고 python을 사용하여 처리할 수 있습니다.

import json
import boto3
import sys
import logging

# logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

VERSION = 1.0

s3 = boto3.client('s3')

def lambda_handler(event, context):
    bucket = 'my_project_bucket'
    key = 'sample_payload.json'
    
    response = s3.get_object(Bucket = bucket, Key = key)
    content = response['Body']
    jsonObject = json.loads(content.read())
    print(jsonObject)

복호화가 되지 않아 잠시 망설였습니다(s3개 오브젝트는 gzipped).

토론이 도움이 되었습니다.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 로그를 확인하십시오. lambda에서는 너무 길면 전체 JSON 파일을 출력하지 않습니다.

json 파일이 다음과 같은 경우:

{
    "test": "test123"
}

액세스 할 수 있습니다.dict다음과 같습니다.

BUCKET="Bucket123"

def get_json_from_s3(key: str):
    """
    Retrieves the json file containing responses from s3. returns a dict

    Args:
        key (str): file path to the json file

    Returns:
        dict: json style dict
    """
    data = client.get_object(Bucket=BUCKET, Key=key)
    json_text_bytes = data["Body"].read().decode("utf-8")
    json_text = json.loads(json_text_bytes)
    return json_text
test_dict = get_json_from_s3(key="test.json")
print(test_dict["test"])

이는 S3를 지원하는 cloudpathlib과 Google Cloud Storage 및 Azure Blob Storage를 사용하면 쉽게 수행할 수 있습니다.다음은 샘플입니다.

import json
from cloudpathlib import CloudPath


# first, we'll write some json data so then we can later read it
CloudPath("s3://mybucket/asdf.json").write_text('{"field": "value"}')
#> 18


# read data from S3
data = json.loads(
    CloudPath("s3://mybucket/asdf.json").read_text()
)

# look at the data
data
#> {'field': 'value'}

# access it now that it is loaded in Python
data["field"] == "value"
#> True

여기에는 특정 옵션 또는 다른 인증 메커니즘설정하거나 영속 캐시를 유지하여 항상 S3에서 재다운로드할 필요가 없다는 점에서 몇 가지 이점이 있습니다.

언급URL : https://stackoverflow.com/questions/40995251/reading-an-json-file-from-s3-using-python-boto3

반응형