【问题标题】:python3: Extract same type value from Json filepython3:从 Json 文件中提取相同类型的值
【发布时间】:2016-12-06 11:29:43
【问题描述】:

以下是我在base64上解码的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=] 

【问题讨论】:

    标签: json python-3.x extract-value


    【解决方案1】:

    一种方法是手动对数据进行排序,如下所示:

    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()
    

    【讨论】:

    • 亲爱的'nlsdfnbch':我关注了你的cmets。但是由于 Json 文件是用 base64 编码的,所以我得到了以下错误。 " TypeError: 列表索引必须是整数或切片,而不是 str "
    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2018-05-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多