Выведенный ResultSet String отказывается от приведения к Dict с DynamoDB noSQL - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь привести ResultSet к Dict, однако приведения Python, похоже, не хотят работать правильно.

Подключение к AWS DynamoDB

c   = boto.dynamodb2.connect_to_region(aws_access_key_id="ACCESSKEYCODE222",aws_secret_access_key="SECRETKEYCODEKFJFJFJF",region_name="us-west-2")
table  = Table("reko_response",connection=c)

# Get the result set from DynamoDB
response = table.scan()
print(type(response)) # type of the response recieved = <class 'boto.dynamodb2.results.ResultSet'>

Проверка стандартного преобразования строки в dict, которое работает правильно

string_of_dict = "{'name':'Frederik'}"
dict_of_string = ast.literal_eval(string_of_dict)
print(type(dict_of_string)) # Outputs Correction: <class 'dict'>

Это работает правильно, и строка приводится к диктату.

ResultSet приводит к строке, которая отказывается использовать Dict

for item in response:
    string_item = json.dumps(str(dict(item)))
    print(string_item)

    print(type(string_item)) # Outputs correctly: <class 'str'>

    # Cast to Dict Attempt 1
    dict_item = json.loads(string_item)
    print(type(dict_item)) # Expected Output: <class 'dict'> | Actual Output: <class 'str'> 

    # Cast to Dict Attempt 2
    dict_item = ast.literal_eval(string_item)
    print(type(dict_item)) # Expected Output: <class 'dict'> | Actual Output: <class 'str'> 

    sys.exit()

Похоже, что ни одно из стандартных приведений Python не приводит к приведению строки набора результатов к dict.

Что здесь происходит?

Фактический результат -

<class 'boto.dynamodb2.results.ResultSet'>
<class 'dict'>
"{'timestamp': 'Time: 2018-05-02 08:42:36.978210', 'ID': '39609c57-6ed5-4fc5-8baa-0007d1aeb7ef', 'Store': 'Coles:Brighton', 'Gender': 'Male', 'Age(high)': Decimal('43'), 'smile': False, 'smile_conf': Decimal('90.57567596435546875'), 'Emotion1': 'HAPPY', 'emo2-conf': Decimal('6.381499767303466796875'), 'Emotion3': 'CALM', 'emo1-conf': Decimal('19.021503448486328125'), 'Age(low)': Decimal('26'), 'emo3-conf': Decimal('5.70695400238037109375'), 'Emotion2': 'SAD'}"
<class 'str'>
<class 'str'>
<class 'str'>

Ожидаемый и целевой результат:

<class 'boto.dynamodb2.results.ResultSet'>
<class 'dict'>
"{'timestamp': 'Time: 2018-05-02 08:42:36.978210', 'ID': '39609c57-6ed5-4fc5-8baa-0007d1aeb7ef', 'Store': 'Coles:Brighton', 'Gender': 'Male', 'Age(high)': Decimal('43'), 'smile': False, 'smile_conf': Decimal('90.57567596435546875'), 'Emotion1': 'HAPPY', 'emo2-conf': Decimal('6.381499767303466796875'), 'Emotion3': 'CALM', 'emo1-conf': Decimal('19.021503448486328125'), 'Age(low)': Decimal('26'), 'emo3-conf': Decimal('5.70695400238037109375'), 'Emotion2': 'SAD'}"
<class 'str'>
<class 'dict'>
<class 'dict'>

Это означает, что последние два отпечатка распечатывают строки, которые должны быть преобразованы в диктовку, но остаются в виде строк.

Любая идея будет принята с благодарностью!

1 Ответ

0 голосов
/ 07 мая 2018

Хорошо, получается, что я не смог преобразовать набор результатов в Dict, однако я мог бы присвоить значения ResultSet новому Dict, ссылаясь на значение каждого из элементов, которые я намерен включить вновый Dict.

Например, скажем, цель состоит в том, чтобы разделить элементы по полу, цикл для решения был бы:

Отделение мужчин от женщин в цикле:

for item in response:
    female_smile = {}
    male_smile = {}

    print("start")

    # Get Dicts of Females who are smiling over time
    if item['Gender'] == 'Female':
        female_smile['timestamp'] = item['timestamp']
        female_smile['Store'] = item['Store']
        female_smile['smile'] = item['smile']
        female_smile_list.append(female_smile)
    # Get Dicts of Males who are smiling over time  
    else: 
        male_smile['timestamp'] = item['timestamp']
        male_smile['Store'] = item['Store']
        male_smile['smile'] = item['smile']
        male_smile_list.append(male_smile)

На этот вопрос не дан полный ответ: «Как я могу привести ResultSet к Dict».Тем не менее, желаемый результат должен был сформировать новый Dict из ResultSet, который был достигнут путем назначения значений ResultSet Dict.

...