【问题标题】:To retrieve specific data from multiple similar portions in a .json file从 .json 文件中的多个相似部分检索特定数据
【发布时间】:2020-05-30 15:22:59
【问题描述】:

部分json文件内容如下:

{"ID": "PK45", "People": "Kate", "Date": "2020-01-05"}, {"ID": "OI85", "People": "John", "Date": "2020-01-18" }, {"ID": "CN658", "People": "Pevo", "Date": "2020-02-01" }

它有多个部分,包含“ID”、“人物”和“日期”。

我想做的是检索 John 的 ID(在本例中为“OI85”。)

如果密钥是唯一的,我可以使用:

data_content = json.loads(data)
ID = data_content['ID']

但是有多个相似的部分。所以我只能先找到“约翰”:

with open("C:\\the_file.json") as data_file:
    data = data_file.read()
    where = data.find('John')
    where_1 = data[where - 20 : where]
    ID = where_1[where_1.find('ID')+3:where_1.find('ID')+7]
    print (ID)

看起来很笨拙。

从 .json 文件中的多个相似部分检索特定数据的智能 json 方法是什么?

谢谢。

【问题讨论】:

  • json 文件内容的那部分可能带有一些未显示的外部容器,例如列表。您可以使用内置的 json 模块遍历该列表并提取其中每个 json 对象(字典)的值。

标签: python json parsing


【解决方案1】:

遍历字典列表,直到找到正确的:

import json

data = '[{"ID": "PK45", "People": "Kate", "Date": "2020-01-05"}, {"ID": "OI85", "People": "John", "Date": "2020-01-18" }, {"ID": "CN658", "People": "Pevo", "Date": "2020-02-01" }]'

data_content = json.loads(data)

def find_id_by_name(name, data):
    for d in data:
        if d['People'] == name:
            return d["ID"]
    else:
        raise ValueError('Name not found')

print(find_id_by_name('John', data_content))
# OI85

print(find_id_by_name('Jane', data_content))
# ... ValueError: Name not found

如果您必须进行许多此类搜索,则可能值得从您的数据中创建另一个字典以将 ID 与名称相关联:

ids_by_name = {d['People']:d['ID'] for d in data_content}
print(ids_by_name['John'])

# OI85

【讨论】:

  • 谢谢!但它给出了“TypeError:字符串索引必须是整数”
  • data 应该是json.loads(....) 的返回值,所以你在代码中调用了data_content。我更新了答案以使其更清楚。
  • 感谢您的更新。您的代码可以工作,但是当我在实际的 .json 文件上使用它时。它从“json.loads(...)”行给出“TypeError:JSON 对象必须是 str、bytes 或 bytearray,而不是 TextIOWrapper”。
  • 因为json.loads 用于从字符串加载数据(因此最后的's'),这也是你在问题的示例代码中所做的,你必须使用@987654327 @ 从文件中加载数据。所以,像with open('your_filename') as f: data_content = json.load(f)
【解决方案2】:

您可能应该使用json 模块,这使任务变得微不足道:

import json

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

for record in records:
    if record['People'] == 'John':
        print(record['ID'])
        break

【讨论】:

  • 谢谢!但它给出了“TypeError:字符串索引必须是整数”
  • json 文件内容可能与您当时提供的示例不完全相同。请准确。
  • 感谢您的跟进。只是原始的 json 文件很大,我只取了一部分。
猜你喜欢
  • 1970-01-01
  • 2021-03-30
  • 2017-01-26
  • 1970-01-01
  • 2019-05-22
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多