質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

720閲覧

Python3 KeyとしてあるはずなのにKey Error

ITOMO5963

総合スコア98

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/03/27 04:32

APIを出力結果から「metric」が"custom.ping-A01.2_2_3_1"の「id」を出力したいですが、
KeyがあるのにKey Errorが出力されてします。
Python初心者のため、ご教示よろしくお願いいたします。

Python3

1import os 2import requests 3 4os.environ['HTTP_PROXY'] 5os.environ['HTTPS_PROXY'] 6url = 'URL' 7api = 'APIキー' 8 9headers = {'X-API-KEY' : api} 10 11mn="custom.ping-A01.2_2_3_1" 12 13def main(): 14 r = requests.get(url, headers=headers) 15 x = r.json() 16 for m in x["monitors"]: 17 if m["metric"]==mn: 18 print(m) 19 print(m["id"]) 20 21if __name__== '__main__': 22 main()

出力結果

{'duration': 3, 'maxCheckAttempts': 1, 'critical': 55555, 'isMute': False, 'metric': 'custom.ping-A01.2_2_3_1', 'excludeScopes': [], 'name': 'custom.ping-A01.2_2_3_1', 'warning': 5, 'id': '3Tn9vU7tGFS', 'scopes': [], 'type': 'host', 'operator': '>'} 3Tn9vU7tGFS {'critical': 1900, 'isMute': False, 'excludeScopes': [], 'memo': '7781', 'type': 'host', 'operator': '>', 'notificationInterval': 10, 'duration': 3, 'maxCheckAttempts': 2, 'metric': 'custom.ping-A01.2_2_3_1', 'name': '帯広支店', 'warning': 200, 'id': '3RWjpKzPrkE', 'scopes': []} 3RWjpKzPrkE Traceback (most recent call last): File "c:/Users/Pythonファイル/Get-Monitoring-01 copy.py", line 22, in <module> main() File "c:/UsersPythonファイル/Get-Monitoring-01 copy.py", line 17, in main if m["metric"]==mn: KeyError: 'metric

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2020/03/27 04:41

「キーがあるのに」と判断した理由はなんですか?出力結果からは無いようにしか判断のしようがありません。
otn

2020/03/27 04:42

print(m)は、ifの上に入れないと意味無いです。 何のために入れたんだか。
guest

回答3

0

おそらくキーにmetricが存在しない場合があるのだと思います.
if m["metric"]==mn:の前にprint("metric" in m)を実行して,キーが存在するかをチェックしたほうがいいと思います.

投稿2020/03/27 04:35

dark-eater-kei

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

たくさんのご教示ありがとうございました。
Keyがないやつを確認でき、条件を細かくしてKeyがないやつは出力されない?ようにしました。

Python3

1 r = requests.get(url, headers=headers) 2 x = r.json() 3 for m in x["monitors"]: 4 if m["type"]=="host": 5 if m["metric"]==mn: 6 print(m["id"])

投稿2020/03/27 05:16

ITOMO5963

総合スコア98

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

あるはずと思っているだけで、実際には無いのでKeyErrorです。
print(m)を入れて無いことを確認するように言ったのに、ある場合だけprintしてますね。

Python

1 for m in x["monitors"]: 2 print(m) 3 if m["metric"]==mn: 4 print(m["id"])

投稿2020/03/27 04:46

otn

総合スコア85949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ITOMO5963

2020/03/27 04:50

教えていただいたのに、すみません。ご回答ありがとうございます。 Keyがないやつを確認しました。 Keyがないやつは無視するといったことは可能でしょうか。
otn

2020/03/27 04:53

それは、dark-eater-kei さんの回答のように in で判断できます。 if "metric" in m:
ITOMO5963

2020/03/27 04:58

大変申し訳ありません。以下できますでしょうか。 「Type」が"host"で「metric」が"custom.ping-A01.2_2_3_1"の「id」を出力。 ``` 【print(m)の出力結果】 ``` {'duration': 3, 'maxCheckAttempts': 1, 'critical': 55555, 'isMute': False, 'metric': 'custom.ping-A01.2_2_3_1', 'excludeScopes': [], 'name': 'custom.ping-A01.2_2_3_1', 'warning': 5, 'id': '3Tn9vU7tGFS', 'scopes': [], 'type': 'host', 'operator': '>'} 3Tn9vU7tGFS {'duration': 3, 'maxCheckAttempts': 2, 'critical': 1500, 'isMute': False, 'metric': 'custom.ping-H15.2_2_9_150', 'excludeScopes': [], 'name': 'custom.ping-H15.2_2_9_150', 'warning': 200, 'id': '3QXEZcrXFMb', 'scopes': [], 'type': 'host', 'operator': '>'} {'duration': 3, 'maxCheckAttempts': 2, 'critical': 1500, 'isMute': False, 'metric': 'custom.ping-H16.2_2_9_151', 'excludeScopes': [], 'name': 'custom.ping-H16.2_2_9_151', 'warning': 200, 'id': '3QXJNu7GjKs', 'scopes': [], 'type': 'host', 'operator': '>'} {'critical': 1900, 'isMute': False, 'excludeScopes': [], 'memo': '回線品目:フレッツ光ネクスト\u3000マンション・ハイスピードタイプ\n回線ID:L5435-46841-7781', 'type': 'host', 'operator': '>', 'notificationInterval': 10, 'duration': 3, 'maxCheckAttempts': 2, 'metric': 'custom.ping-A01.2_2_3_1', 'name': '帯広支店ルータ死活監視', 'warning': 200, 'id': '3RWjpKzPrkE', 'scopes': []} 3RWjpKzPrkE {'isMute': False, 'excludeScopes': [], 'name': 'connectivity', 'id': '3QPXmoYtNm9', 'scopes': [], 'type': 'connectivity'} Traceback (most recent call last): File "c:/Users/Pythonファイル/Get-Monitoring-01 copy.py", line 24, in <module> main() File "c:/UsersPythonファイル/Get-Monitoring-01 copy.py", line 19, in main if m["metric"]==mn: KeyError: 'metric ``` コード ``` import os import requests os.environ['HTTP_PROXY'] os.environ['HTTPS_PROXY'] url = 'URL' api = 'キー' headers = {'X-API-KEY' : api} mn="custom.ping-A01.2_2_3_1" def main(): r = requests.get(url, headers=headers) x = r.json() for m in x["monitors"]: print(m) if m["metric"]==mn: print(m["id"]) if __name__== '__main__': main() ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問