簡體   English   中英

如何使用關鍵字在 json 文件中搜索特定行?

[英]How do I search for a certain line in a json file with a key word?

我想知道如何搜索具有特定名稱的行。 這是帶有 json 的 my.txt 文件:

{"people": [{"name": "Scott", "website": "stackabuse.com", "from": "Nebraska"}, {"name": "Larry", "website": "google.com", "from": "Michigan"}, {"name": "Tim", "website": "apple.com", "from": "Alabama"}]}

這是我的代碼

import json

file = open('data.txt', "r")
read = file.read()
y = json.loads(read)

first = y["people"][0]
second = y["people"][1]
third = y["people"][2]

print(y["people"][0]["name"])

這會打印出 Scott,但是有沒有辦法在 json 文件中搜索名稱為 Scott 的行? 我試過 print(y["people"]["name": "Scott"]) 但這沒有用。 我希望 output 是 {"name": "Scott", "website": "stackabuse.com", "from": "Nebraska"}

您可以使用列表推導來過濾列表。 例如

>>> people = y['people']
>>> people_named_scott = [p for p in people if p['name'] == 'Scott']
>>> people_named_scott
[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]

您可以將姓名為Scott的人員的信息存儲在列表中。

Python代碼:

import json

file = open('data.txt', "r")
read = file.read()
y = json.loads(read)
people = y["people"]
lines = [person for person in people if person["name"] == "Scott"]
if len(lines) == 0:
    print("Scott is not found")
else:
    for line in lines:
        print(line)

data.txt

{"people": [{"name": "Scott", "website": "stackabuse.com", "from": "Nebraska"}, {"name": "Larry", "website": "google.com", "from": "Michigan"}, {"name": "Tim", "website": "apple.com", "from": "Alabama"}]}

Output:

{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}

我建議使用 jmespath ( https://pypi.org/project/jmespath/ )

如果我理解正確,您正在嘗試打印名稱為 Scott 的 json 列表。

print([jobj if jobj['name']=='Scott' for jobj in y['people']])

你可以做這樣的事情,它迭代所有人,然后返回具有匹配名稱的第一個人。

def getPersonByName(allInfo, name):
    for info in allInfo["people"]:
        if info["name"] == name:
            return info

allInfo = {"people": [{"name": "Scott", "website": "stackabuse.com", "from": "Nebraska"}, {"name": "Larry", "website": "google.com", "from": "Michigan"}, {"name": "Tim", "website": "apple.com", "from": "Alabama"}]}

print(getPersonByName(allInfo, "Scott"))

您可以使用內置filter function 結合lambda表達式作為解決方案。

data={"people": [{"name": "Scott", "website": "stackabuse.com", "from": "Nebraska"}, {"name": "Larry", "website": "google.com", "from": "Michigan"}, {"name": "Tim", "website": "apple.com", "from": "Alabama"}]}
print(filter(lambda x:x['name'] == 'Scott',data['people']))
# gives [{'website': 'stackabuse.com', 'from': 'Nebraska', 'name': 'Scott'}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM