gpt4 book ai didi

python - 如何通过忽略boto3中的空元素将JSON数据写入Dynamodb

转载 作者:太空宇宙 更新时间:2023-11-03 14:51:09 24 4
gpt4 key购买 nike

我想将以下数据组写入Dynamodb。
大约有100条数据。由于不一定需要图像,因此混合使用和不使用 image_url 元素。

(问题列表.json)

{
"q_id" : "001",
"q_body" : "Where is the capital of the United States?",
"q_answer" : "Washington, D.C.",
"image_url" : "/Washington.jpg",
"keywords" : [
"UnitedStates",
"Washington"
]
},
{
"q_id" : "002",
"q_body" : "Where is the capital city of the UK?",
"q_answer" : "London",
"image_url" : "",
"keywords" : [
"UK",
"London"
]
},

由于是写测试阶段,要写的Dynamodb是在localhost:8000中使用serverless框架的serverless-dynamodb-local插件准备的,不是生产环境。
为了将上面的JSON数据写入这个Dynamodb,我在Boto 3 (AWS SDK for Python)中写了下面的代码。

from __future__ import print_function
import boto3
import codecs
import json

dynamodb = boto3.resource('dynamodb', region_name='us-east-1', endpoint_url="http://localhost:8000")

table = dynamodb.Table('questionListTable')

with open("questionList.json", "r", encoding='utf-8') as json_file:
items = json.load(json_file)
for item in items:
q_id = item['q_id']
q_body = item['q_body']
q_answer = item['q_answer']
image_url = item['image_url']
keywords = item['keywords']

print("Adding detail:", q_id, q_body)

table.put_item(
Item={
'q_id': q_id,
'q_body': q_body,
'q_answer': q_answer,
'image_url': image_url,
'keywords': keywords,
}
)

执行这段代码时,空字符部分出现如下错误。

botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the PutItem operation: One or more parameter values were invalid: An AttributeValue may not contain an empty string

貌似是JSON的空字符引起的。
如果像下面这样将包含空字符的image_url排除在写入目标之外,写入就没有问题了。

from __future__ import print_function
import boto3
import codecs
import json

dynamodb = boto3.resource('dynamodb', region_name='us-east-1', endpoint_url="http://localhost:8000")

table = dynamodb.Table('questionListTable')

with open("questionList.json", "r", encoding='utf-8') as json_file:
items = json.load(json_file)
for item in items:
q_id = item['q_id']
q_body = item['q_body']
q_answer = item['q_answer']
#image_url = item['image_url']
keywords = item['keywords']

print("Adding detail:", q_id, q_body)

table.put_item(
Item={
'q_id': q_id,
'q_body': q_body,
'q_answer': q_answer,
#'image_url': image_url,
'keywords': keywords,
}
)

由于DynamoDB是NoSQL,可能还有其他方法可以很好地利用其特性,但是如何更正代码来编写忽略空字符的上述数据?我想说“如果image_url存在,就写它,如果不存在,忽略它。”

谢谢。

最佳答案

我解决了我的问题。您可以按如下方式设置 null。

from __future__ import print_function
import boto3
import codecs
import json

dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1', endpoint_url="http://localhost:8000")

table = dynamodb.Table('questionListTable')

with open("questionList.json", "r", encoding='utf-8_sig') as json_file:
items = json.load(json_file)
for item in items:
q_id = item['q_id']
q_body = item['q_body']
q_answer = item['q_answer']
image_url = item['image_url'] if item['image_url'] else None
keywords = item['keywords'] if item['keywords'] else None

print("Adding detail:", q_id, q_body)

table.put_item(
Item={
'q_id': q_id,
'q_body': q_body,
'q_answer': q_answer,
'image_url': image_url,
'keywords': keywords,
}
)

为了查看Dynamodb的情况,使用serverless框架的离线插件在本地环境运行API Gateway。当我实际使用 Postman 调用 API 时,Null 被正确地插入到值中。

{
"q_id" : "001",
"q_body" : "Where is the capital of the United States?",
"q_answer" : "Washington, D.C.",
"image_url" : "/Washington.jpg",
"keywords" : [
"UnitedStates",
"Washington"
]
},
{
"q_id" : "002",
"q_body" : "Where is the capital city of the UK?",
"q_answer" : "London",
"image_url" : "null",
"keywords" : [
"UK",
"London"
]
},

关于python - 如何通过忽略boto3中的空元素将JSON数据写入Dynamodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45747004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com