2017-01-08 16 views
-2

結果のjsonデータを解析して、必要なセクションのみを返すときに問題が発生しました(たとえば、「名前」、「通路」、「ステータス」)。これらのアイテムのみを出力するように出力を変更するにはどうすればよいですか?Pythonでjsonデータを解析する

コード:

for coro in tqdm(asyncio.as_completed(tasks, loop=loop)): 
    try: 
     response = await coro 
     if response is None: 
      continue 
     data, store = response 
     result = json.loads(data['searchResults'])['results'][0] 
     summary = { 
      'name': result['name'], 
      'aisle': result['price']['aisle'][0], 
      'status': result['inventory']['status'], 
     } 
     results[store] = summary 
    except (IndexError, KeyError): 
     continue 

    with open('Testing.txt', 'w') as outfile: 
    json.dump(results, outfile, indent = 2) 
    outfile.write('\n') 

私は次の形式を取得印刷する場合:

'35': { 'name': 'Camera', 'aisle': 'M.35', 'status': 'Out of stock' }, 
    '36': { 'name': 'Camera', 'aisle': 'J.35', 'status': 'In stock' } 

{ 
    "1": { 
    "name": "camera", 
    "aisle": "M.3", 
    "status": "In Stock" 
    }, 
    "2": { 
    "name": "camera", 
    "aisle": "M.53", 
    "status": "Out of Stock" 
    }, 
    "3":{ 
    "name": "camera", 
    "aisle": "M.32", 
    "status": "In Stock" 
    } 
} 

を私のような、単一のライン上の各ループのための出力を希望

+0

万が一['json'](https://docs.python.org/3/library/json.html)ドキュメントを読んだことがありますか? JSONデータをPythonのdictに変換する方法を説明しています。次に、適切なdict要素にアクセスして、好きなように印刷するだけです。 – MattDMo

+0

その場合は、jsonを使用して項目を追加してテキストファイルに書き込む方がよいでしょう。 – Kasramvd

+0

ありがとうございます - 上記の投稿を更新しましたが、次のエラーが表示されています:NameError:name 'data'が定義されていません –

答えて

1

FYI - 値stringが有効なjsonでないため、出力ファイルのサンプルデータが正しく表示されません。あなたのJSONの私のバージョンではなく、あなたの中にある

"{\"results\":[{\"name\":\"Camera\",\"department\":{\"name\":\"Electronics\",\"storeDeptId\":-1},\"location\":{\"aisle\":[\"M.35\"],\"detailed\":[{\"zone\":\"M\",\"aisle\":\"36\",\"section\":\"2\"}]},\"price\":{\"priceInCents\":49900,\"isRealTime\":true,\"currencyUnit\":\"USD\"},\"inventory\":{\"quantity\":3,\"status\":\"Out of stock\",\"isRealTime\":true}}]}" 

]:それはこのようにする必要があります。

data = json.loads(data['searchResults']) 
print json.dumps(data, indent=2) 

あなたを取得する必要があります:あなたは有効なJSONを取得したら、あなたはからデータを引き出すことができる値にそのJSON文字列を変換するためにjson.loadsを使用することができます今すぐ

{ 
    "results": [ 
    { 
     "department": { 
     "name": "Electronics", 
     "storeDeptId": -1 
     }, 
     "inventory": { 
     "status": "Out of stock", 
     "isRealTime": true, 
     "quantity": 3 
     }, 
     "price": { 
     "priceInCents": 49900, 
     "isRealTime": true, 
     "currencyUnit": "USD" 
     }, 
     "name": "Camera", 
     "location": { 
     "detailed": [ 
      { 
      "aisle": "36", 
      "section": "2", 
      "zone": "M" 
      } 
     ], 
     "aisle": [ 
      "M.35" 
     ] 
     } 
    } 
    ] 
} 

0:

for coro in asyncio.as_completed(tasks, loop=loop): 
    try: 
     data, store = await coro 
     result = json.loads(data['searchResults'])['results'][0] #Storing retrieved json data 
     summary = { 
      'name': result['name'], 
      'aisle': result['location']['aisle'][0], 
      'status': result['inventory']['status'], 
     } 
     results[store] = summary 
    except (IndexError): 
     continue 

はこの後、あなたの出力ファイルの出力には、以下のようになります。このような何かをしたい、あなたがトリミングされ、出力に近いでしょう

'35': { 'name': 'Camera', 'aisle': 'M.35', 'status': 'Out of stock' }, 
+0

ありがとうございます - 上記の投稿を更新しましたが、次のエラーが発生しています:NameError:name 'data'は定義されていません –

+0

更新されたコードブロックの最後の2行は必要ありません。 txtファイルを出力する元のコードに置き換えてください。 – 2ps

+0

ありがとう!! –

関連する問題