代码之家  ›  专栏  ›  技术社区  ›  j panton

使用循环创建JSON格式

  •  -1
  • j panton  · 技术社区  · 6 年前

    我正在为AWS DynamoDB创建一个表。所有关于如何使用所需JSON格式的文档都是完全手动演示的。。。在我的例子中,我想创建几个表,每个表都有几个列-当我知道我的列标题及其数据类型时,手动这样做似乎效率很低。。。

    boto3网站有一个指南,其中包含以下代码片段:

    # Get the service resource.
    dynamodb = boto3.resource('dynamodb')
    
    # Create the DynamoDB table.
    table = dynamodb.create_table(
        TableName='users',
        KeySchema=[
            {
                'AttributeName': 'username',
                'KeyType': 'HASH'
            },
            {
                'AttributeName': 'last_name',
                'KeyType': 'RANGE'
            }
        ],
        AttributeDefinitions=[
            {
                'AttributeName': 'username',
                'AttributeType': 'S'
            },
            {
                'AttributeName': 'last_name',
                'AttributeType': 'S'
            },
    
        ],
        ProvisionedThroughput={
            'ReadCapacityUnits': 5,
            'WriteCapacityUnits': 5
        }
    )
    

    现在我想知道,当然,如果您的数据中有数百个列/属性类型,您不会想坐在那里输入所有内容。如何通过循环自动化此过程?我有一个大致的想法,但我来自Java,我不太擅长思考这种情况下的解决方案。

    有人能帮忙吗?谢谢

    编辑:

    我用措辞回答了这个问题 可怕的 ,并且在文档中陷得太深,无法理解我在问什么。我想要一个使用循环自动向DynamoDB表添加数据的解决方案。我在下面的回答中解释。

    1 回复  |  直到 6 年前
        1
  •  0
  •   j panton    6 年前

    所以当时我还不知道-我的问题中显示的代码片段只是关于定义键模式的-即您的主键/复合键。我想做的是向表中添加实际数据,这些示例都是在boto3文档中手动完成的。

    回答我自己的问题:首先,您显然需要创建和定义关键模式,而这根本没有时间使用问题中显示的模板手动执行。

    请注意,Boto3不允许浮点值。。。我的解决办法是把它们变成 str 类型。Boto3建议使用 Decimal 但是 Decimal(str(value)) 无法工作,因为它是作为字符串传递的 Decimal(value) 出于某种原因(有人能解释一下吗?): Passing a Decimal(str(value)) to a dictionary for raw value

    这就是我如何使用pandas从excel导入数据,然后自动将数据放入我的表中:

    #panda reads the excel document to extract df
    df = pd.read_excel(fileRoute,dtype=object)
    
    #the column headers are allocated to the keys variable
    keys= df.columns.values
    
    #create a dynamodb instance and link it to an existing table in dynamodb
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table(name)
    
    #batch_writer() allows the addition of many items at once to the table
    with table.batch_writer() as batch:
        dfvalues = df.values
    
        #loop through values to generate dictionaries for every row in table
        for sublist in dfvalues:
            dicts = {}
            for ind, value in enumerate(sublist):
                if type(value) is float:
                    if math.isnan(value): #you might want to avoid 'NaN' types
                        continue
                    value = str(value) #convert float values to str
                dicts[headings[ind]] = value
            batch.put_item(
                Item=dicts #add item to dynamoDB table
            )