【问题标题】:How do I search for a certain line in a json file with a key word?如何使用关键字搜索 json 文件中的某一行?
【发布时间】:2020-05-27 07:30:36
【问题描述】:

我想知道如何搜索具有特定名称的行。这是我的带有 json 的 .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"]) 但这没有用。我希望输出是 {"name": "Scott", "website": "stackabuse.com", "from": "Nebraska"}

【问题讨论】:

  • 如果我理解正确,您正在尝试打印名称为 Scott 的 json 列表。然后 [ jobj if jobj['name'] == 'Scott' for jobj in y['people']]

标签: python json search keyword


【解决方案1】:

您可以使用list comprehension 过滤列表。例如

>>> 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'}]

【讨论】:

  • 好的,谢谢!这行得通。我会在 7 分钟内给它加一张支票。只是为了让我明白这一点:
  • p for p in people 意味着它搜索每一行?
  • @maxmeinz,查看docs.python.org/3/tutorial/…
  • 所以它就像一个范围循环,每次有新行时都会搜索它? (我所说的一行是 {"name": "Scott", "website": "stackabuse.com", "from": "Nebraska"})
【解决方案2】:

您可以将姓名为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"}]}

输出:

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

【讨论】:

  • 如果名称为“Scott”的行不存在,有没有办法显示错误消息?
  • @maxmeinz,更新了代码。如果lines 不包含任何元素,那么我们可以向用户显示一条消息。你想抛出错误吗?
  • 哦,好的,它有效!因为如果你不这样做,那么它只会打印 [],也就是 0 行,对吧?
  • @maxmeinz,是的,如果lines 为空,则没有包含名称Scott 的行。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果我理解正确,您正在尝试打印名称为 Scott 的 json 列表。

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

    【讨论】:

      【解决方案5】:

      你可以做这样的事情,它迭代所有人,然后返回具有匹配名称的第一个人。

      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"))
      

      【讨论】:

        【解决方案6】:

        您可以使用内置的filter 函数和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'}]
        

        【讨论】:

          猜你喜欢
          • 2020-06-26
          • 1970-01-01
          • 2021-07-26
          • 1970-01-01
          • 1970-01-01
          • 2015-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多