展平从网站检索到的嵌套JSON,并在Python3中写入CSV

2024-09-28 20:50:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我们想从IMF网站获取数据,并将其转储到csv文件中。为此,可以使用IMF发布的API获取数据。但是,检索到的json列表包含一个嵌套字典,该字典可能为空,或者根据数据不为null的年份具有不同数量的元素。 下面是一个片段,用于确定问题。我们正在通过jupyter笔记本使用python3.6.5

我们尝试过使用json\u 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\u 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

Tags: csvjsonurl字典timevaluenanperiod
1条回答
网友
1楼 · 发布于 2024-09-28 20:50:46

这也许会有帮助

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

相关问题 更多 >