0

私はpythonが初めてで、json応答があります(以下を参照)。site1id の値を検索し、id のすべての値をリストしたいと考えていました。

{ "listSiteResponse" : { "count":4 ,"site" : [  {
  "id": "28e4cc3f-d0c2-46f4-9e0c-b532fd148292",
  "simpleid": 15,
  "name": "Site1",
  "description": "Blr1",
  "location": "Bangalore1",
}, {
  "id": "188d4b47-1955-43e1-82a8-7ccedcfc636b",
  "simpleid": 16,
  "name": "Site2",
  "description": "Blr2",
  "location": "Bangalore2",
}, {
  "id": "63fab512-4b52-4038-8a3b-4632f1911dca",
  "simpleid": 17,
  "name": "Site3",
  "description": "Blr3",
  "location": "Bangalore3",
}, {
  "id": "2db3949a-ba2f-4e93-85b5-24a995fa3d99",
  "simpleid": 18,
  "name": "Site4",
  "description": "Blr4",
  "location": "Bangalore4",
} 
}}

ID を一覧表示するために次のスクリプトを試しましたが、エラーが発生します。

from pprint import pprint
json_data=open('logs/CurrentSitesList.txt')

data = json.load(json_data)
test=data["listSiteResponse"]["site"]["id"]
4

1 に答える 1

2

idsiteを取得しようとしていますlistSiteResponseが、問題はそれdata["listSiteResponse"]["site"]が単一のアイテムではないことであり、リストlistの を取得できません。id代わりに、idそのリスト内のすべてのアイテムまたは 1 つのアイテムのみを取得できます。

ids = [x["id"] for x in data["listSiteResponse"]["site"]]

コンパクトなリスト内包表記構文を使用しない場合、これは次と同等です。

ids = []
for site in data["listSiteResponse"]["site"]:
    ids.append(site["id"])

しかし、リスト内包表記の構文は、IMO の方がはるかに読みやすくなっています (明らかに短いだけでなく)。

また、ファイルを開くときは、ファイルが閉じられていることを確認する必要があります。したがって、次のいずれかを使用できますtry-finally

with open('logs/CurrentSitesList.txt') as f:
    data = json.load(f)

PS PEP8を読みたいかもしれません:)

更新:コメント内の OP による追加のコメントに従って:

与えられたサイトのリスト

sites = data["listSiteResponse"]["site"]

特定の ID を持つサイトを検索したい場合があります

site = [x for x in sites if x["id"] == <SPECIFIC_ID>].pop(0, None)
# site will contain either the found object, or None

または、条件に一致するサイトの ID を見つける (前のスニペットを一般化する)

site = [x for x in sites if x["name"] == "Site 1"].pop(0, None)
site_id = site["id"] if site else None
# site_id will contain the ID of the matching site, None otherwise

ただし、2 番目のケースでは、条件によっては複数の結果が得られる可能性があるため、その場合はそれに応じてコードを調整してください。

より完全な Python チュートリアルについては、無料で入手できる本Learn Python the Hard Wayを参照してください。

于 2013-10-02T11:43:58.110 に答える