使用Python boto3从S3读取JSON文件

Nan*_*nju 29 python json amazon-s3 amazon-web-services boto3

我一直在S3桶"测试"中关注JSON

{
  'Details' : "Something" 
}
Run Code Online (Sandbox Code Playgroud)

我使用以下代码来读取此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'])
Run Code Online (Sandbox Code Playgroud)

我收到错误,因为'字符串索引必须是整数' 我不想从S3下载文件,然后阅读..

bas*_*flp 28

如上面的评论所述,repr必须删除,json文件必须使用双引号的属性.在aws/s3上使用此文件:

{
  "Details" : "Something"
}
Run Code Online (Sandbox Code Playgroud)

和以下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
Run Code Online (Sandbox Code Playgroud)

  • 别人注意:https://boto3.readthedocs.io/en/latest/reference/services/s3.html#object`s3.Object('bucketName','keyName')`这样一个例子来获取文件`s3 :// foobarBucketName/folderA/folderB/myFile.json`将是`s3.Object('foobarBucketName','folderA/folderB/myFile.json')` (7认同)

alu*_*ach 22

想补充一点,它botocore.response.streamingbody适用于json.load

import json
import boto3

s3 = boto3.resource('s3')

obj = s3.Object(bucket, key)
data = json.load(obj.get()['Body']) 
Run Code Online (Sandbox Code Playgroud)


Haf*_*man 10

以下对我有用.

# 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 
Run Code Online (Sandbox Code Playgroud)

对于最佳实践,直接对AWS ID和密钥进行硬编码并不是一个好主意.您可以从存储在本地存储中的json文件中读取AWS凭据,如下所示:

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']
                     )
Run Code Online (Sandbox Code Playgroud)

  • @Hafizur Ra​​hman-这里的变量 `text` 是一个字符串,所以 ```print(text['Details'])``` 不起作用。我相信您必须相应地更新代码片段。 (2认同)

Piy*_*hal 5

您可以在 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)
Run Code Online (Sandbox Code Playgroud)