Python добавляет значения в словарь: TypeError: строковые индексы должны быть целыми числами - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь написать код, который будет принимать значения json из Kafka и выводить их в файл .csv. Проблема заключается в том, что для оценок в качестве вложенных объектов значения имеют либо науку, либо математику, либо просто английский.

Вот как выглядят данные:

{'id': 0, 'name': 'Susan', 'lastName': 'Johnsan', 'grades': {'science': 78, 'математика': 89}}

{'id': 1, 'name': 'Mary', 'lastName': 'Davids', 'grades': {'english': 85}}

Однако, когда я запускаю свой код, я получаю ошибку TypeError: строковые индексы должны быть целыми числами.

from kafka import KafkaConsumer
import json
import csv
import sys
from datetime import datetime
import os

# connect to kafka topic
kaf = KafkaConsumer('students.all.events')


outputfile = 'C:\\Users\\Documents\\students_output.csv'

outfile = open(outputfile, mode='w', newline='')
master_key = ['id', 'name', 'lastName', 'science', 'math', 'english']

writer = csv.DictWriter(outfile, master_key, delimiter="|")
writer.writeheader()
'''
writer = csv.writer(outfile)
writer.writerow(['JSON_Data'])
'''

i = 1
for row in kaf:
    if i < 5000:
        json_row = json.loads(row.value)
        print('Row: ', i)
        print(json_row)

        dict = {'id': json_row['id'], 'name': json_row['name'], 'lastName': json_row['lastName']}

        for value in json_row['grades']:
            if value['science'] is not None:
                dict['science'] = value['science']
                dict['math'] = value['math']

            elif value['english'] is not None:
                dict['english'] = value['english']

        writer.writerow(dict)
        i += 1
    else:
        break

outfile.close()

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Проверьте, действительно ли переменная value имеет тип dict, поскольку полученная ошибка, как правило, означает, что вы пытаетесь получить доступ к объекту string в dict [ключ] путь.

0 голосов
/ 13 ноября 2018

Основываясь на помощи, которую мне дал @TenorFlyy, я изменил свой код, чтобы решить проблему:

from kafka import KafkaConsumer
import json
import csv
import sys
from datetime import datetime
import os

# connect to kafka topic
kaf = KafkaConsumer('students.all.events')


outputfile = 'C:\\Users\\Documents\\students_output.csv'

outfile = open(outputfile, mode='w', newline='')
master_key = ['id', 'name', 'lastName', 'science', 'math', 'english']

writer = csv.DictWriter(outfile, master_key, delimiter="|")
writer.writeheader()
'''
writer = csv.writer(outfile)
writer.writerow(['JSON_Data'])
'''

i = 1
for row in kaf:
    if i < 5000:
        json_row = json.loads(row.value)
        print('Row: ', i)
        print(json_row)

        dict = {'id': json_row['id'], 'name': json_row['name'], 'lastName': json_row['lastName']}

        for key, value in json_row['grades'].items():
            dict[key] = value

        writer.writerow(dict)
        i += 1
    else:
        break

outfile.close()
0 голосов
/ 13 ноября 2018

Похоже, у вас есть опечатка - по крайней мере, в коде, который вы вставили здесь. После клавиши lastName есть дополнительная двойная кавычка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...