2016-12-06 58 views
0

以下是我在base64上解碼的Json文件。python3:從Json文件中提取相同類型的值

response={"response": [{"objcontent": [{"title": "Pressure","rowkeys": [ 
        "lat", 
        "lon", 
        "Pressure" 
       ], 
       "rowvalues": [ 
        [ 
         "WxsArK0NV0A=", 
         "uaQCWFxSM0A=", 
         "ncvggc7lcUA6MVVLnZiMQH6msaA+0yhANzLp2RsZhkBwobfXt9BXQKtxbnjV+IFARq3fVqOWiEBwyyvmt+V9QDGg7k8YUHpA4IZm9W/De0A=" 
        ], 
        [ 
         "WxsArK0NV0A=", 
         "HqJT4w7RUkA=", 
         "BfPox4I5ikCLVYxUxWqIQIFwlJFA+IVAJeQ6gBLyhEBB0QlkoGiCQDOkvnAZUm1AkGbWKEgza0A+FCkwH4phQHwSRSY+iVRAKcvC4pRliEA=" 
        ], 
        [ 
         "WxsArK0NV0A=", 
         "G5rYdw0NXkA=", 
         "C9dhhIVrg0B2hCvzOoKKQMrMWhll5o5AIujgxBB0ZkD8+EipfXx0QOXh0LLycH5ATdtxKqbtdkAw66X3l/VhQLqvZBbd13FAjKl2+8UUjUA=" 
        ], 
        [ 
         "WxsArK0NV0A=", 
         "PTvsm55daEA=", 
         "W+wyHC12dUCrvSLM1d6BQMfay0ZjbYpAjnk4Ecc8dkDH35pL429xQPTOwkF6Z41Aci5JATkXjUBQ6Wjlp3RQQFlpNGmsNHpAFf0DUor+dUA=" 
        ]]}]}]} 

我對這些值進行了解碼並使用這些值繪製了一個繪圖。以下是代碼。

import base64 
import struct 
import numpy as np 
import pylab as pl 
for response_i in response['response']: 
    for row in response_i['objcontent'][0]['rowvalues']: 
     for item in row[:]: 
      decoded=base64.b64decode(item) 
      if len(decoded)<9: 
       a=struct.unpack('d',decoded) 

      else: 
       decoded=base64.b64decode(item) 
       a=struct.unpack('10d',decoded) 
      last=np.array(a) 
      pl.show(pl.plot(last)) 

但我想分離每個列表的價值。在「行鍵」中有3個元素[ "lat", "lon", "Pressure"],因此在每個列表rowvalues中有3個值。

我的問題是如何分開rowvalues中的不同值並將它們添加到每組rowkeys中。所以,最後我想有3個列表,其中包括所有的解碼值。

'lat': [WxsArK0NV0A=,WxsArK0NV0A=,WxsArK0NV0A=,WxsArK0NV0A=] 

'lon': [uaQCWFxSM0A=,HqJT4w7RUkA=,G5rYdw0NXkA=,PTvsm55daEA=] 

'pressure': [ncvggc7lcUA6MVVLnZiMQH6msaA+0yhANzLp2RsZhkBwobfXt9BXQKtxbnjV+IFARq3fVqOWiEBwyyvmt+V9QDGg7k8YUHpA4IZm9W/De0A=, BfPox4I5ikCLVYxUxWqIQIFwlJFA+IVAJeQ6gBLyhEBB0QlkoGiCQDOkvnAZUm1AkGbWKEgza0A+FCkwH4phQHwSRSY+iVRAKcvC4pRliEA=, C9dhhIVrg0B2hCvzOoKKQMrMWhll5o5AIujgxBB0ZkD8+EipfXx0QOXh0LLycH5ATdtxKqbtdkAw66X3l/VhQLqvZBbd13FAjKl2+8UUjUA=, W+wyHC12dUCrvSLM1d6BQMfay0ZjbYpAjnk4Ecc8dkDH35pL429xQPTOwkF6Z41Aci5JATkXjUBQ6Wjlp3RQQFlpNGmsNHpAFf0DUor+dUA=] 

回答

0

一種方法是將數據排序手動,像這樣:

from collections import defaultdict 
from base64 import b64decode 
import json 

d = defaultdict(list) 

js = '' 
with open(json_file) as f: 
    js = b64decode(f.read()).decode() 
js = json.loads(js) 

response = js['response']['obj_content'][0] 
for i, col_name in enumerate(response['row_keys']): 
    for row_val in ['row_values']: 
     d[col_name].append(row_val[i]) 

defaultdict會自動創建一個新的list當一個鍵被稱作以前根本不存在,這使你的代碼略更時尚。

另一種選擇是使用pandas.DataFrame和加載數據,像這樣:

import pandas as pd 
response = json_file['response']['obj_content'][0] 
df = pd.DataFrame(response['row_values'], columns= response['row_keys']) 

整潔件事pandas是,它在其功能相當廣闊;例如,你可以使用以前創建的DataFrame像這樣展現您的數據:

df.plot() 
+0

親愛的「nlsdfnbch」:我跟着你的意見。但由於JSON文件是用base64編碼的,所以我得到了以下錯誤。 「TypeError:列表索引必須是整數或切片,而不是str」 – popo