JSON: TypeError: строковые индексы должны быть целыми числами

Я пытаюсь отфильтровать следующий пример файла .json, где ["cbaCode"]['HHH'] отличается от "300":

{
  "took" : 32,
  "timed_out" : false,
  "_shards" : {
    "total" : 12,
    "successful" : 12,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1549,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "ib-prodfulltext-t24-transhist-202211",
        "_type" : "_doc",
        "_id" : "D7JGOQTS2XPVSG6HN",
        "_score" : null,
        "_source" : {
          "accountNbr" : 6900069,
          "accountNbrText" : "6900069",
          "acctApplNbr" : "02",
          "acknowledgementDate" : "2022-11-01T01:46:38.000+01:00",
          "acknowledgementDateText" : "2022-11-01",
          "avoType" : "ADI",
          "bankCode" : "0100",
          "bankingCore" : "T24",
          "bazenType" : "ADI",
          "businessDate" : "2022-11-01",
          "cbaCode" : "10000101002",
          "cbaCodeParts" : {
            "BBB" : "002",
            "HHH" : "100",
            "TT" : "01",
            "VVV" : "001"
          },
          "chargeType" : "SHAR",
          "creditDebitIndicator" : "D",
          "currencyCode" : "CZK",
          ...

Я пытался:

import json

with open('2022-10.json', 'r') as f:
    input_dict = json.load(f)
output_dict = [x for x in input_dict if not x['HHH'] == "300"]
output_json = json.dumps(output_dict)
print(output_json)

... что вызывает:

TypeError: строковые индексы должны быть целыми числами

Я думаю, что мне не хватает запроса файла json на 5-м уровне, но он как бы теряется в структуре.

Помощь приветствуется.

Вы имеете в виду ["cbaCodeParts"]['HHH'] ?

0x0fba 06.12.2022 12:46

Содержит ли ваш файл один JSON (как в вашем примере) или массив JSON, как мы можем предположить, когда ваш код повторяется input_dict?

0x0fba 06.12.2022 12:48

@0x0fba Да, "cbaCodeParts", там опечатка Да, он содержит один файл с несколькими сообщениями.

Stanislav Jirak 06.12.2022 13:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны указать точный путь внутри вашего дерева Json:

import json

with open('2022-10.json', 'r') as f:
    input_dict = json.load(f)

output_dict = [x for x in input_dict["hits"]["hits"]
  if not x["_source"]["cbaCodeParts"]["HHH"] == "300"
]

output_json = json.dumps(output_dict)
print(output_json)

Доступ только к данным верхнего уровня, который является словарем, даст вам только список этого словаря, а не массив, который вам может понадобиться. Приведенный выше код предполагает, что вы хотите просмотреть массив, предоставленный вторым hits-полем.

Кроме того, предоставление дополнительных файлов Json может помочь людям лучше понять вашу проблему.

Я получаю KeyError: 'cbaCodeParts'. Когда я пытаюсь использовать data = input_dict['hits']['hits'] and data['_source'], я получаю TypeError: индексы списка должны быть целыми числами или фрагментами, а не str.

Stanislav Jirak 06.12.2022 13:24
input_dict['hits']['hits'] — это массив, а это значит, что вы должны обращаться к нему с помощью таких чисел, как input_dict ['hits'] ['hits'] [12345] или, когда вы присваиваете его переменной: data[123]. Затем вы можете вытащить _source вот так: data[n]['_source'] где n — число. Короче говоря: input_dict['hits']['hits'] содержит несколько экземпляров _source, и вам нужно указать, какой из них вы хотите.
areop-enap 08.12.2022 03:42

Другие вопросы по теме