【问题标题】:Writing json to file in s3 bucket将 json 写入 s3 存储桶中的文件
【发布时间】:2022-01-24 18:31:42
【问题描述】:

这段代码将json写入s3中的一个文件, 我想要实现的是而不是打开 data.json 文件并写入 s3 (sample.json) 文件,

如何直接传递 json 并写入 s3 中的文件?

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?
  • 是的......简单来说......我在一些操作后得到了一些 json 数据,我想在 S3 中创建一个 filename.json 文件并将该 json 写入这个文件。

标签: python boto3


【解决方案1】:

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

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

【讨论】:

  • 为什么要使用str()json.dumps()(复数转储)创建一个 JSON 格式的字符串。
【解决方案2】:

我不确定我的问题是否正确。您只想使用 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')))
)

【讨论】:

  • “your-bucket-name”是否包含通过存储桶中任何子文件夹的路径,或者是否包含在“your-file.json”名称中?
  • @Sledge - 不在存储桶中,文件名包含该信息:s3.Object('your-bucket-name', 'folder/subfolder/your_file.json')
  • 您还应该指定内容类型。如果您使用此方法,则应添加 ContentType 参数,例如: s3object.put( Body=(bytes(json.dumps(json_data).encode('UTF-8'))), ContentType='application/json ')
【解决方案3】:

Amazon S3 是一个对象存储(实际上是文件存储)。主要操作是 PUT 和 GET。您不能将数据添加到 S3 中的现有对象中。您只能替换整个对象本身。

有关您可以在 s3 上执行的可用操作的列表,请参阅此链接 http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectOps.html

【讨论】:

  • 我收到此错误 - botocore.exceptions.ClientError:调用 ListObjects 操作时发生错误(PermanentRedirect):您尝试访问的存储桶必须使用指定的端点进行寻址。请将所有未来的请求发送到此端点。
  • 所以每次要更改里面的数据都得替换整个文件?
  • @lolelo 是的。如果您使用 REST API 或使用 REST API 的 SDK,则会替换整个文件。我不知道其他解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
相关资源
最近更新 更多