индексы списка должны быть целыми числами или фрагментами, а не ошибкой str при попытке извлечь данные из файла json

#python-3.x

#python-3.x

Вопрос:

Я пытаюсь извлечь некоторые данные из файла json в корзине s3, однако я получаю эту ошибку: индексы списка должны быть целыми числами или срезами, а не str.

Вот код:

 content_object = s3.get_object(Bucket=source_bucket, Key=key)['Body']
json_content = json.load(content_object)
for i in json_content:
        ID = json_content[i]['ID']
        DateTime = json_content[i]['DateTime']
        SourceDevice = json_content[i]['SourceDevice']
        DestinationDevice = json_content[i]['DestinationDevice']
        DataType= json_content[i]['DataType']
        Activity = json_content[i]['Activity']
  

И файл json:

 [
    {
        "ID": "No.",
        "DateTime": "Time",
        "SourceDevice": "Source",
        "DestinationDevice": "Destination",
        "DataType": "Protocol",
        "Activity": "label"
    },
    {
        "ID": "1",
        "DateTime": "SomeTime",
        "SourceDevice": "SomeSource",
        "DestinationDevice": "SomeDestination",
        "DataType": "ARP",
        "Activity": "normal"
    },
  

Я просмотрел множество тем с той же проблемой, но я не смог найти ответ, связанный с моим кодом.Спасибо за вашу помощь!

Комментарии:

1. Перво-наперво: что находится i в for i in json_content , и вы уверены, что json_content с помощью i этого можно проиндексировать позже?

2. for i in json_content: => type(i) ==> dict … остальная часть вашего кода не имеет особого смысла из-за этого….

Ответ №1:

При использовании for x in some_list в Python вы получаете значения в списке как x автоматически, а не индекс в списке. Итак, вы хотите сделать это вместо:

 for item in json_content:
    ID = item['ID']
    ...
  

Если вам также нужен индекс списка в цикле, используйте enumerate :

 for index, value in enumerate(json_content):
    print(index, value['SourceDevice']) # prints "0 Source" and "1 SomeSource"
  

Комментарии:

1. Он возвращает dict. Большое вам спасибо за вашу помощь, с вашим первым ответом все отлично сработало!

Ответ №2:

Вам нужно изменить

 for i in json_content
  

с

 for i in range(len(json_content))
  

Вы пытаетесь проиндексировать список с помощью элемента списка json_content. В качестве альтернативы вы можете сделать

 ID = i['ID'] 
  

для получения элементов словаря.