Я думаю, что здесь есть две основные проблемы:
- Запрос селектора кажется неправильным - я пробовал это с
'$.users.name.text'
и обнаружил, что это работает для меня (используя Python3 и objectpath) - Функция неправильно формирует список имен
Вместо этого попробуйте что-то подобное:
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
постоянно создается, и возвращается только последняя.
Вы также можете увеличить скорость, используя чистый 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 раз быстрее для небрежной версии.