gpt4 book ai didi

python - 如何在 python 中使用 Objectpath 导航包含数组的 JSON 文件以选择值?

转载 作者:行者123 更新时间:2023-12-01 01:35:20 24 4
gpt4 key购买 nike

我有多个 JSON 文件需要覆盖,但似乎无法访问下面的特定文本(分散注意力)。这是文件中一行的示例:

{"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' 尝试过此操作,发现这对我有用(使用 Python3 和 objectpath)
  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 变量被重复实例化,并且仅返回最后一个。

您还可以通过使用纯 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 倍。

关于python - 如何在 python 中使用 Objectpath 导航包含数组的 JSON 文件以选择值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52443658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com