Python, анализирующий файл JSON, выводит только один результат

Я новичок в json, пытаюсь проанализировать два элемента (несколько вхождений), я почти уверен, что выполняю неправильную итерацию.

Мой json-файл:

{
  "data": {
    "chapter": {
      "bibleId": "9f3cb709f9bded60-01",
      "bookId": "PSA",
      "id": "PSA.117",
      "content": [
        {
          "type": "paragraph",
          "style": "nb",
          "content": [
            {
              "type": "verse-number",
              "style": "v",
              "verseId": "PSA.117.1",
              "verseOrgId": [
                "PSA.117.1"
              ],
              "content": "1"
            },
            {
              "type": "verse-text",
              "verseId": "PSA.117.1",
              "verseOrgId": [
                "PSA.117.1"
              ],
              "verseText": "Sed ut perspiciatis unde omnis iste natus."
            },
            {
              "type": "verse-number",
              "style": "v",
              "verseId": "PSA.117.2",
              "verseOrgId": [
                "PSA.117.2"
              ],
              "content": "2"
            },
            {
              "type": "verse-text",
              "verseId": "PSA.117.2",
              "verseOrgId": [
                "PSA.117.2"
              ],
              "verseText": "Lorem ipsum dolor sit amet."
            }
          ]
        }
      ],
      "number": "117",
      "next": {
        "id": "PSA.118",
        "bookId": "PSA",
        "number": "118"
      },
      "previous": {
        "id": "PSA.116",
        "bookId": "PSA",
        "number": "116"
      },
      "copyright": "1969/77 Deutsche Bibelgesellschaft, Stuttgart",
      "verseCount": 2,
      "title": "Psalmi 117"
    },
    "studyContent": null,
    "chapterImage": null
  }
}

Желаемый результат:

PSA.117.1       Sed ut perspiciatis unde omnis iste natus.
PSA.117.2       Lorem ipsum dolor sit amet.

Мой результат:

PSA.117.1       Sed ut perspiciatis unde omnis iste natus.

Мой код:

import json
with open('data.json') as f:
    data = json.load(f)

for i, verse in enumerate(data['data']['chapter']['content']):
    if i == 0:
        print("%s\t%s" % (verse['content'][0]['verseId'], verse['content'][1]['verseText']))
    elif i == 1:
        print("%s\t%s" % (verse['content'][0]['verseId'], verse['content'][1]['verseText']))

Обратите внимание, что вы делаете одно и то же в обеих ветвях if..else, делая if..else лишним, делая i переменной лишней, enumerate делая лишней.

deceze 11.06.2024 14:57
Почему в 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
1
56
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проблема в вашем скрипте заключается в том, как вы перебираете структуру JSON и получаете доступ к данным стиха.

Предоставленная вами структура JSON содержит содержимое массива внутри data['data']['chapter']['content'], которое содержит только один элемент (абзац), а затем внутри этого абзаца есть содержимое массива. содержащий стихи.

import json

# Load the JSON data
with open('data.json') as f:
    data = json.load(f)

# Get the verses from the JSON structure
verses = data['data']['chapter']['content'][0]['content']

# Initialize variables for storing verse number and text
verse_number = None
verse_text = None

# Iterate through the verse data
for item in verses:
    if item['type'] == 'verse-number':
        verse_number = item['verseId']
        
    elif item['type'] == 'verse-text':
        verse_text = item['verseText']
        if verse_number is not None:
            print("%s\t%s" % (verse_number, verse_text))
            verse_number = None  # Reset verse number for the next verse

Поскольку узлы verse-text также содержат verseId, я не вижу причин вообще обращать внимание на узлы verse-number, что только усложняет задачу.

deceze 11.06.2024 15:06
Ответ принят как подходящий

Вам нужен еще один цикл по внутреннему списку content и отфильтровать узлы, входящие в typeverse-text:

for chapter in data['data']['chapter']['content']:
    for verse in chapter['content']:
        if verse['type'] == 'verse-text':
            print(verse['verseId'], verse['verseText'], sep='\t')

Этот делает свою работу. Код @mitsuaaki был в порядке, но при примерно 31 строке он выдал 5 результатов.

bsteo 11.06.2024 15:10

Вероятно, потому, что он также только что посмотрел на один жестко запрограммированный ['content'][0]. Эмпирическое правило: для каждого списка ([]) нужен один for .. in.

deceze 11.06.2024 15:12
a = data['data']['chapter']['content'][0]['content']
for i, verse in enumerate(a):
    if i == 1:
        print("%s\t%s" % (verse['verseId'], verse['verseText']))
    elif i == 3:
        print("%s\t%s" % (verse['verseId'],verse['verseText'])) 

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