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

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

新規登録して質問してみよう
ただいま回答率
85.31%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

Q&A

解決済

1回答

1188閲覧

pythonでjsonデータ読み込み時、条件に合うデータのみ取得する方法

kouji_39

総合スコア164

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

0グッド

0クリップ

投稿2023/06/25 01:55

編集2023/06/25 02:06

実現したいこと

pythonでjsonデータ読み込み時、条件に合うデータのみ取得したい。

前提

pythonで、jsonデータ読み込みをしています。
jsonデータの入れ子の構造が、複雑なのかエラーが出ます。
データは、以下を「j3.json」で保存して、コードで読み込むようにしてあります。

jsonデータ

1{'metadata': {'detail': '橋', 2 'parameter': {'id': '37,139'}, 3 'title': '調書'}, 4 'result': [{'調書11': [{'damage_mains': [{'class': '', 5 'construct_type_code': 'S', 6 'damage_level': 'b', 7 'damage_type_value': 'ひびわれ', 8 'element_no': '0101', 9 'material_code': 'C', 10 'part_material_code': 'Mg', 11 'part_material_value': '主桁'}, 12 {'class': '', 13 'construct_type_code': 'S', 14 'damage_level': 'd', 15 'damage_pattern_value': '', 16 'damage_type_value': '剥離・鉄筋露出', 17 'element_no': '0101', 18 'material_code': 'C', 19 'part_material_code': 'Mg', 20 'part_material_value': '主桁'}, 21 {'class': '', 22 'construct_type_code': 'S', 23 'damage_level': 'e', 24 'damage_pattern_value': '', 25 'damage_type_value': '漏水・遊離石灰', 26 'element_no': '0101', 27 'material_code': 'C', 28 'part_material_code': 'Mg', 29 'part_material_value': '主桁'}, 30 {'class': '', 31 'construct_type_code': 'S', 32 'damage_level': 'd', 33 'damage_type_value': 'ひびわれ', 34 'element_no': '0401', 35 'material_code': 'C', 36 'part_material_code': 'Mg', 37 'part_material_value': '主桁'}], 38 'diameter': '1'}, 39 {'damage_mains': [{'class': '', 40 'construct_type_code': 'S', 41 'damage_level': 'a', 42 'damage_type_value': 'ひびわれ', 43 'element_no': '0102', 44 'material_code': 'C', 45 'part_material_code': 'Mg', 46 'part_material_value': '主桁'}, 47 {'class': '', 48 'construct_type_code': 'S', 49 'damage_level': 'a', 50 'damage_type_value': 'NON', 51 'element_no': '0103', 52 'material_code': 'C', 53 'part_material_code': 'Cr', 54 'part_material_value': '横桁'}], 55 'diameter': '2'}], 56 'nendo': 2021}], 57 'resultset': {'count': 1, 'is_error': False}}

発生している問題・エラーメッセージ

TypeError Traceback (most recent call last) <ipython-input-58-6c6866b8204e> in <cell line: 1>() 1 for item in j: ----> 2 if item['part_material_code'] == 'Mg' and item['material_code'] == 'C' and item['damage_type_value'] == 'ひびわれ': 3 damage_level=item['damage_level'] 4 part_material_code=item['part_material_code'] 5 material_code=item['material_code'] TypeError: string indices must be integers

該当のソースコード

import json import ast from pprint import pprint with open('/content/j3.json') as f: j = ast.literal_eval(f.read()) #pprint(j) #'Mg' 、 'C' 、'ひびわれ'の複数条件を満足する時に、damage_level、 part_material_code、material_code、damage_type_value、 #element_no、diameterの値を取得させたい。「j3.json」では、複数条件満足が3通りの該当箇所がある。 #できれば、条件検索で該当箇所が無い場合は、自動でストップしたい(breakを入れる?) for item in j: if item['part_material_code'] == 'Mg' and item['material_code'] == 'C' and item['damage_type_value'] == 'ひびわれ': damage_level=item['damage_level'] part_material_code=item['part_material_code'] material_code=item['material_code'] damage_type_value=item['damage_type_value']    element_no=item['element_no']    diameter=item['diameter'] #csvファイルとして出力 df.to_csv('./diameter+'_'+element_no+'.csv'',index=False,encoding='cp932')#「j3.json」の例では、3ファイルできる予定

試したこと

「TypeError: string indices must be integers」でgoogle検索したが、解決しなかった。

補足情報(FW/ツールのバージョンなど)

googlecolab上で動作

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

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

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

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

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

guest

回答1

0

ベストアンサー

この回答はGPT-4による自動生成回答です

以下のように修正しました。j の構造に注意して、適切なネストされたデータにアクセスするようにしています。

python

1import json 2import ast 3from pprint import pprint 4 5with open('/content/j3.json') as f: 6 j = ast.literal_eval(f.read()) 7 8# 'Mg' 、 'C' 、'ひびわれ'の複数条件を満足する時に、damage_level、 part_material_code、material_code、damage_type_value、 9# element_no、diameterの値を取得させたい。「j3.json」では、複数条件満足が3通りの該当箇所がある。 10# できれば、条件検索で該当箇所が無い場合は、自動でストップしたい(breakを入れる?) 11 12results = j['result'] 13for result in results: 14 for item in result['調書11']: 15 for damage_main in item['damage_mains']: 16 if (damage_main['part_material_code'] == 'Mg' and 17 damage_main['material_code'] == 'C' and 18 damage_main['damage_type_value'] == 'ひびわれ'): 19 damage_level = damage_main['damage_level'] 20 part_material_code = damage_main['part_material_code'] 21 material_code = damage_main['material_code'] 22 damage_type_value = damage_main['damage_type_value'] 23 element_no = damage_main['element_no'] 24 diameter = item['diameter'] 25 26 # csvファイルとして出力 27 # df.to_csv('./diameter+'_'+element_no+'.csv'',index=False,encoding=

このコードは、j の構造に従って、適切なネストされたデータにアクセスし、条件に一致するデータを取得します。ただし、このコードはまだ CSV ファイルに出力する部分が未完成です。pandas を使用してデータフレームを作成し、CSV ファイルに出力することができます。

投稿2023/06/25 01:56

teratail-ai

Powered by GPT-4

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

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

kouji_39

2023/06/25 02:12

results = j['result'] for result in results: for item in result['調書11']: for damage_main in item['damage_mains']: if (damage_main['part_material_code'] == 'Mg' and damage_main['material_code'] == 'C' and damage_main['damage_type_value'] == 'ひびわれ'): damage_level = damage_main['damage_level'] part_material_code = damage_main['part_material_code'] material_code = damage_main['material_code'] damage_type_value = damage_main['damage_type_value'] element_no = damage_main['element_no'] diameter = item['diameter'] print(damage_level," ",part_material_code," ",material_code) print(damage_type_value," ",element_no," ",diameter) で、うまく動きました。 出力は、以下のようになります。 d Mg C ひびわれ 0401 1 a Mg C ひびわれ 0102 2 下記のデータをも取得するには、どうしたら良いでしょうか。 b Mg C ひびわれ 0101 1
kouji_39

2023/06/25 02:13

★別の質問として、投稿いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問