Преобразование JSON в плоский файл на Python

#python #json

#python #json

Вопрос:

Я хотел бы прочитать файл формата JSON, где ключ не всегда одинаков, и преобразовать его в плоский файл для дальнейшей обработки. Я пытался найти решение для этого, но ничего не получалось.

Вот пример данных JSON.

 {
    "Meta Data": {
        "1. Information": "Intraday (5min) open, high, low, close prices and volume",
        "2. Symbol": "MSFT",
        "3. Last Refreshed": "2019-04-15 13:05:00",
        "4. Interval": "5min",
        "5. Output Size": "Compact",
        "6. Time Zone": "US/Eastern"
    },
    "Time Series (5min)": {
        "2019-04-15 13:05:00": {
            "1. open": "120.8250",
            "2. high": "120.9400",
            "3. low": "120.7800",
            "4. close": "120.9275",
            "5. volume": "152975"
        },
        "2019-04-15 13:00:00": {
            "1. open": "120.8900",
            "2. high": "120.8900",
            "3. low": "120.8000",
            "4. close": "120.8250",
            "5. volume": "156065"
        },
        "2019-04-15 12:55:00": {
            "1. open": "120.8600",
            "2. high": "120.9000",
            "3. low": "120.8450",
            "4. close": "120.8950",
            "5. volume": "53450"
        },
    }
}       
  

Я пытаюсь преобразовать это в формат ниже

 2019-04-15 13:05:00,120.8250,120.9400,120.7800,120.9275,152975
2019-04-15 13:00:00,120.8900,120.8900,120.8000,120.8250,156065
2019-04-15 12:55:00,120.8600,120.9000,120.8450,120.8950,53450
  

Я попробовал что-то вроде приведенного ниже.

 url = URL from where data is coming in JSON format.
response = requests.get(url, headers=header, cookies=cookies)
dic = json.loads(response.content)
len_of_timeseries = len(dic["Time Series (1min)"])
key_len = {}
for k in dic["Time Series (1min)"]:
  print (dic["Time Series (1min)"][k])
f = open(symbolFile,"w") 
f.write(write the file here)
f.close
  

Выше инструкции print приведены сведения о печати, как показано ниже. Он вообще не читает поле даты.

 {'1. open': '11689.7998', '2. high': '11690.6504', '3. low': '11689.3496', '4. close': '11689.5996', '5. volume': '0'}
{'1. open': '11687.2500', '2. high': '11690.2002', '3. low': '11686.6504', '4. close': '11689.3496', '5. volume': '0'}
  

Любая помощь будет оценена.

Спасибо

Комментарии:

1. вам нужен for цикл внутри существующего for цикла

Ответ №1:

Значение k в вашем цикле for содержит дату, которую вы ищете:

 for k in dic["Time Series (1min)"]:
    print (dic["Time Series (1min)"][k])
    print(k) # this will print the date
  

Ответ №2:

 dic = {
    "Meta Data": {
        "1. Information": "Intraday (5min) open, high, low, close prices and volume",
        "2. Symbol": "MSFT",
        "3. Last Refreshed": "2019-04-15 13:05:00",
        "4. Interval": "5min",
        "5. Output Size": "Compact",
        "6. Time Zone": "US/Eastern"
    },
    "Time Series (5min)": {
        "2019-04-15 13:05:00": {
            "1. open": "120.8250",
            "2. high": "120.9400",
            "3. low": "120.7800",
            "4. close": "120.9275",
            "5. volume": "152975"
        },
        "2019-04-15 13:00:00": {
            "1. open": "120.8900",
            "2. high": "120.8900",
            "3. low": "120.8000",
            "4. close": "120.8250",
            "5. volume": "156065"
        },
        "2019-04-15 12:55:00": {
            "1. open": "120.8600",
            "2. high": "120.9000",
            "3. low": "120.8450",
            "4. close": "120.8950",
            "5. volume": "53450"
        },
    }
}
  

.

 items = dic["Time Series (5min)"]

for dt, v in items.items():
    row = [dt] # date time
    row  = v.values()
    print(','.join(row))
  

Результат

 2019-04-15 13:05:00,120.8250,120.9400,120.7800,120.9275,152975
2019-04-15 13:00:00,120.8900,120.8900,120.8000,120.8250,156065
2019-04-15 12:55:00,120.8600,120.9000,120.8450,120.8950,53450
  

Но это может не учитывать порядок в строке.
Если вы знаете ключи "1. open" , "2. high" , и т.д., То было бы лучше использовать их для поддержания порядка.

 for dt, v in items.items():
    row = [dt, v["1. open"], v["2. high"], v["3. low"], v["4. close"], v["5. volume"]]
    print(','.join(row))