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