【问题标题】:Flatten nested JSON retrieved from website and write to CSV in Python 3展平从网站检索的嵌套 JSON 并在 Python 3 中写入 CSV
【发布时间】:2019-01-07 17:57:59
【问题描述】:

我们想从 IMF 网站获取数据并将其转储到 csv 文件中。获取数据是使用 IMF 为此目的发布的 API 完成的。但是,检索到的 json 列表包含一个嵌套字典,该字典可能为空或具有不同数量的元素,具体取决于数据不为空的年份。 下面是一个 sn-p,用于查明问题。我们正在通过 jupyter notebook 使用 python 3.6.5

我们尝试过使用 json_normalize 但它只能将顶层转换为 csv。 JSON 的第二个元素包含一个嵌套字典,这会导致不需要的输出。

import requests
from pandas.io.json import json_normalize
#url = 'http://dataservices.imf.org/REST/SDMX_JSON.svc/CompactData/IFS/A.AU..?startPeriod=2017&endPeriod=2019'
url = 'http://dataservices.imf.org/REST/SDMX_JSON.svc/CompactData/IFS/A.AU.FDSBT_XDC+GG_GEG_G01_XDC+FFSE_XDC.?startPeriod=2017&endPeriod=2019'
# Navigate to series in API-returned JSON data
json_raw = (requests.get(f'{url}').json()['CompactData']['DataSet']['Series'])

json_normalize(json_raw)

json_normalize 导致输出为(观察包含嵌套字典数组的“Obs”导致问题)

  @FREQ      @INDICATOR @REF_AREA @TIME_FORMAT @UNIT_MULT                                                                                              Obs  Obs.@OBS_VALUE Obs.@TIME_PERIOD
0     A        FFSE_XDC        AU          P1Y          6                                                                                              NaN  15750.23064215             2017
1     A  GG_GEG_G01_XDC        AU          P1Y          6  [{'@TIME_PERIOD': '2017', '@OBS_VALUE': '4168'}, {'@TIME_PERIOD': '2018', '@OBS_VALUE': '3443'}]            NaN              NaN
2     A       FDSBT_XDC        AU          P1Y          6                                                                                              NaN             NaN              NaN

我们希望得到如下结果,以便我们可以将结构化格式转储到 csv

  @FREQ      @INDICATOR @REF_AREA @TIME_FORMAT @UNIT_MULT Obs.@OBS_VALUE_0 Obs.@TIME_PERIOD_0 Obs.@OBS_VALUE_1 Obs.@TIME_PERIOD_1
0     A        FFSE_XDC        AU          P1Y          6 15750.23064215                 2017              NaN                NaN
1     A  GG_GEG_G01_XDC        AU          P1Y          6 4168                           2017 3443                           2018
2     A       FDSBT_XDC        AU          P1Y          6              NaN                NaN              NaN                NaN

【问题讨论】:

    标签: python json api csv


    【解决方案1】:

    这可能会有所帮助

    def get_details_in_csv(jsonData):
        csvio = io.StringIO()
        names = ['Account Number', 'Account Name', 'Region', 'SG', 'Inbound port', 'Inbound IP', 'Assessment']
        writer = csv.DictWriter(csvio, fieldnames=names)
        writer.writeheader()
        for security_group in jsonData['SecurityGroups']:
            groupId = security_group["GroupId"]
            for inboundEntry in security_group["InboundDetails"]:
                inboundPort = inboundEntry['port']
                inboundIP = inboundEntry['source']
                assessment = inboundEntry['assessment']
                writer.writerow({'Account Number': ACCOUNT_NUMBER, 'Account Name': ACCOUNT_NAME, 'Region': REGION,
                                 'SG': groupId, 'Inbound port': inboundPort,
                                 'Inbound IP': inboundIP, 'Assessment': assessment})
    
        response = csvio.getvalue()
        print(csvio.getvalue())
        csvio.close()
        return response
    

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 2021-02-06
      • 2020-01-21
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多