将JSON写入S3存储桶中的文件

65

这段代码将json写入s3文件,我想要实现的是直接传递json并将其写入s3文件,而不是打开data.json文件并将其写入s3(sample.json)文件。

import boto3

s3 = boto3.resource('s3', aws_access_key_id='aws_key', aws_secret_access_key='aws_sec_key')
s3.Object('mybucket', 'sample.json').put(Body=open('data.json', 'rb'))

你是说你想直接将JSON数据传递到位于S3上的文件,而无需上传新文件到S3? - Usman Mutawakil
是的...简单来说,我在进行一些操作后得到了一些JSON数据,我想在S3中创建一个filename.json文件,并将该JSON写入此文件。 - Learning
4个回答

98

如果我理解得正确的话,您想使用Boto3将JSON数据写入文件?以下代码可以将Python字典写入JSON文件。

import json
import boto3    
s3 = boto3.resource('s3')
s3object = s3.Object('your-bucket-name', 'your_file.json')

s3object.put(
    Body=(bytes(json.dumps(json_data).encode('UTF-8')))
)

1
“your-bucket-name” 是否包括存储桶中任何子文件夹的路径,还是该路径应写在 “your-file.json” 的名称中? - Sledge
5
@Sledge - 不是在存储桶(bucket)中,文件名包含了那个信息:s3.Object('你的存储桶名称', '文件夹/子文件夹/你的文件.json') - robertlayton
4
如果您使用这种方法,还应该指定内容类型。您可以添加ContentType参数,例如: s3object.put( Body=(bytes(json.dumps(json_data).encode('UTF-8'))), ContentType='application/json' ) - Alex Young

77

不知道是否仍有人试图使用此线程,但我试图上传一个JSON到s3,尝试使用上述方法,但对我来说并不完全有效。自2018年以来,Boto和s3可能已经发生了变化,但这对我来说取得了结果:

import json
import boto3

s3 = boto3.client('s3')
json_object = 'your_json_object here'
s3.put_object(
     Body=json.dumps(json_object),
     Bucket='your_bucket_name',
     Key='your_key_here'
)

6
为什么要使用str()json.dumps()(复数形式的dumps)创建一个JSON格式的字符串。 - pjw
正文(字节或可寻址文件对象)-- 对象数据。json.dumps将返回str,而不是字节。您需要使用.encode("utf-8")。来自https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.put_object - Alberto Megía

7

我收到了这个错误 - botocore.exceptions.ClientError: 调用ListObjects操作时发生错误(PermanentRedirect):您正在尝试访问的存储桶必须使用指定的端点地址。请将所有未来的请求发送到此端点。 - Learning
看看这个是否有帮助 https://stackoverflow.com/questions/32246149/permanentredirect-when-calling-the-putobject-operation - Usman Mutawakil
那么每次想要更改其中的数据,您都必须替换整个文件吗? - lolelo
1
@lolelo 是的。如果您使用REST API或使用REST API的SDK,则整个文件将被替换。我不知道其他解决方案。 - Usman Mutawakil

4

除了Joseph McCombs的答案,还可以使用s3fs来实现。

from s3fs import S3FileSystem

json_object = {'test': 3.14}
path_to_s3_object = 's3://your-s3-bucket/your_json_filename.json'

s3 = S3FileSystem()
with s3.open(path_to_s3_object, 'w') as file:
    json.dump(json_object, file)

当某些原因导致boto3无法正常工作时,这是一个完美的选择... - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接