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
'programing' 카테고리의 다른 글
Windows에서 bat 파일을 사용하여 폴더와 모든 콘텐츠를 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
---|---|
C# 평탄화 json 구조 (0) | 2023.04.03 |
Word press에서 태그 링크를 재생하는 방법 (0) | 2023.04.03 |
경고 해결 방법: 리액트가 DOM 요소의 X 프로펠을 인식하지 않음 (0) | 2023.04.03 |
Angular-ui 라우터는 2개의 상태를 동시에 활성화 합니다. (0) | 2023.04.03 |