Как я могу перемещаться по файлу JSON с массивом для выбора значений с помощью Objectpath в python?

1

У меня есть несколько файлов JSON для покрытия и, похоже, нет доступа к определенному тексту (distracter) ниже. Это пример строки в файле:

{"extracted":"high","nameid":3201932,"users":{"name":[{"ids":[28,37],"text":"distracter"}],"symbols":[]}}

Ниже приведен код, который я написал, который возвращает пустой результат:

data = []
with open(fileName, 'r') as file_to_read:
    for line in file_to_read:
        data.append(json.loads(line))
        json_tree = objectpath.Tree(data)
        text_result= tuple(json_tree.execute('$.users.name[@.text]'))
return text_result
  • 1
    Должно ли имя быть вложенным массивом? Если нет, вы можете сделать имя вложенного словаря и просто получить доступ к users.name.text .
Теги:
arrays
tree
objectpath

1 ответ

1
Лучший ответ

Я думаю, что здесь есть две основные проблемы:

  1. Селекторный запрос кажется неправильным - я пробовал это с помощью '$.users.name.text' и обнаружил, что это сработало для меня (используя Python3 и pathpath)
  2. Функция не создает правильный список имен

Попробуйте что-то вроде этого:

import json
import objectpath


def get_names_tree(data):
    tree = objectpath.Tree(data)
    return tuple(tree.execute('$.users.name.text'))


def load_data(file_name):
    names = []

    with open(file_name) as fh:
        for line in fh:
            data = json.loads(line)
            names.extend(get_names_tree(data))

    return names

В вышеприведенном цикле мы создаем список имен, а не декодированных объектов. В вашей версии переменная text_result неоднократно text_result и возвращается только последняя.

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

def get_names_careful(data):
    return tuple(
        name['text'] for name in
        data.get('users', {}).get('name', [])
        if 'text' in name
    )


def get_names(data):
    return tuple(name['text'] for name in data['users']['name'])

Во-первых, старайтесь не поднимать ошибки с отсутствующими данными, но если вы знаете, что ваши данные всегда правильной формы, вы можете попробовать вторую.

В моем тестировании они в 15 раз быстрее (для тщательной версии) и 20 раз быстрее для небрежной версии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню