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

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

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

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

Q&A

解決済

2回答

6945閲覧

pythonでの値の取得

nyonyosuke

総合スコア73

Python 3.x

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

0グッド

0クリップ

投稿2018/08/29 09:04

現在、あるAPIを叩いて下記のようなレスポンスが返ってきてます。
返ってきた statusの値(下記で言うCriticalを取りたい)だけを取りたいのですが、どのようにして取ればいいのか教えていただけますでしょうか。

res = curl XXXXXX

下記 print(res) の結果です。
これを value = res['alert'] とすると
"byte indices must be integers or slices, not str"
とエラーが出てしまいます。

{"alerts": [ {"id":"3XXXXXXX","status":"CRITICAL","monitorId":"3XXXXX","type":"connectivity","openedAt":1535526664,"hostId":"3XXXX" } ] }

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

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

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

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

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

tachikoma

2018/08/29 09:27

エラーが発生するコードの部分を追記してください。
guest

回答2

0

ベストアンサー

これでいかがでしょう。
alertsのつづりにも注意してください。

value = res['alerts'][0]['status']

こちらの環境では
value = res['alerts'] で
"byte indices must be integers or slices, not str"ではなく
KeyError: 'alerts'が発生しましたが理由はわかりません。

投稿2018/08/29 09:16

WEjpon

総合スコア88

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

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

nyonyosuke

2018/08/29 09:22

ご回答ありがとうございます。やはり "byte indices must be integers or slices, not str" が発生してしまいます。。。
WEjpon

2018/08/29 09:26

resをどこかでbyte配列に変換していませんか? 変換するとそのエラーが出ました。
nyonyosuke

2018/08/29 09:30 編集

詳細にお伝えするとMackerelという監視サービスからAPIで持ってきているのですが、下記の内容で持ってきています。 `print(ret)`の部分では最初にご質問させていただいたレスポンスが返ってきています。 ``` cmd = 'curl -H "X-Api-Key: XXXXXXXX" https://mackerel.io/api/v0/alerts' ret = subprocess.check_output(cmd, shell=True) print(ret) print(ret["alerts"]) ```
tachikoma

2018/08/29 09:36

たぶんJSON形式の文字列そのままなんじゃないですかね。parseする必要がありそう。
WEjpon

2018/08/29 09:36

そのサービスの使用経験ありませんが、retの型 print(type(ret)) はどうでしょう?
nyonyosuke

2018/08/29 09:38

<class 'bytes'> と出てきます。ということはこれをstr型に変換と言うことになるのでしょうか?
tachikoma

2018/08/29 09:43

JSONのパーサーは標準モジュールにあるので、そのretをloadsで変換してやればいいかも。
WEjpon

2018/08/29 09:44

import json ret = json.load(ret) これでどうでしょう?
nyonyosuke

2018/08/29 09:46

ありがとうございます。下記のコードで取れました。 ret = subprocess.check_output(cmd, shell=True) str_data = json.loads(ret) print(str_data['alerts'][0]['status'])
WEjpon

2018/08/29 09:50

よかったです。私も勉強になりました。jsonも経験ありませんが str_dataは文字列でなく辞書型のような気がします。
guest

0

value = dct['alerts'][0]['status']
としたら如何でしょうか。
質問文の['alert']は['alerts']のミスではありませんか。
以下にipythonの結果をのせておきます。

ipython

1In [1]: dct = {"alerts": 2 ...: [ 3 ...: {"id":"3XXXXXXX","status":"CRITICAL","monitorId":"3XXXXX","type":"connectivity","ope 4 ...: nedAt":1535526664,"hostId":"3XXXX" 5 ...: } 6 ...: ] 7 ...: } 8 ...: 9 10In [2]: dct 11Out[2]: 12{'alerts': [{'hostId': '3XXXX', 13 'id': '3XXXXXXX', 14 'monitorId': '3XXXXX', 15 'openedAt': 1535526664, 16 'status': 'CRITICAL', 17 'type': 'connectivity'}]} 18 19In [3]: dct['alerts'] 20Out[3]: 21[{'hostId': '3XXXX', 22 'id': '3XXXXXXX', 23 'monitorId': '3XXXXX', 24 'openedAt': 1535526664, 25 'status': 'CRITICAL', 26 'type': 'connectivity'}] 27 28In [4]: dct['alerts']['ststus'] 29--------------------------------------------------------------------------- 30TypeError Traceback (most recent call last) 31<ipython-input-4-fbe317a82bfe> in <module>() 32----> 1 dct['alerts']['ststus'] 33 34TypeError: list indices must be integers or slices, not str 35 36In [5]: dct['alerts'][0] 37Out[5]: 38{'hostId': '3XXXX', 39 'id': '3XXXXXXX', 40 'monitorId': '3XXXXX', 41 'openedAt': 1535526664, 42 'status': 'CRITICAL', 43 'type': 'connectivity'} 44 45In [6]: dct['alerts'][0]['status'] 46Out[6]: 'CRITICAL' 47 48In [7]:

投稿2018/08/29 09:33

ikapy

総合スコア1167

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問