Я изучаю Python, и я сталкиваюсь с чтением JSON с использованием Python, и я застрял в следующем, не зная, как справиться с подобными ситуациями. Я действительно ценю твою помощь.

Я использую Python 3.6 и формат файла JSON, как показано ниже

JSON :

{
    "Meta Data": {
        "1. Information": "Intraday (5min) open, high, low, close prices and volume",
        "2. Symbol": "MSFT",
        "3. Last Refreshed": "2019-07-03 13:05:00",
        "4. Interval": "5min",
        "5. Output Size": "Compact",
        "6. Time Zone": "US/Eastern"
    },
    "Time Series (5min)": {
        "2019-07-03 13:05:00": {
            "1. open": "137.4500",
            "2. high": "137.5000",
            "3. low": "137.2064",
            "4. close": "137.5000",
            "5. volume": "0"
        },
        "2019-07-03 13:00:00": {
            "1. open": "137.4800",
            "2. high": "137.6000",
            "3. low": "137.2400",
            "4. close": "137.4500",
            "5. volume": "759357"
        },
        "2019-07-03 12:55:00": {
            "1. open": "137.4300",
            "2. high": "137.5100",
            "3. low": "137.4015",
            "4. close": "137.4720",
            "5. volume": "371471"
        },
        "2019-07-03 12:50:00": {
            "1. open": "137.3750",
            "2. high": "137.4500",
            "3. low": "137.2800",
            "4. close": "137.4333",
            "5. volume": "222396"
        },
        "2019-07-03 12:45:00": {
            "1. open": "137.4100",
            "2. high": "137.4700",
            "3. low": "137.3200",
            "4. close": "137.3727",
            "5. volume": "248270"
        },
        "2019-07-03 12:40:00": {
            "1. open": "137.3000",
            "2. high": "137.4128",
            "3. low": "137.2900",
            "4. close": "137.4100",
            "5. volume": "177767"
        },
        "2019-07-03 12:35:00": {
            "1. open": "137.3200",
            "2. high": "137.3700",
            "3. low": "137.2600",
            "4. close": "137.3000",
            "5. volume": "194017"
        },
        "2019-07-03 12:30:00": {
            "1. open": "137.3797",
            "2. high": "137.4250",
            "3. low": "137.3100",
            "4. close": "137.3100",
            "5. volume": "148587"
        },
        "2019-07-03 12:25:00": {
            "1. open": "137.4400",
            "2. high": "137.4500",
            "3. low": "137.3600",
            "4. close": "137.3750",
            "5. volume": "163235"
        },
        "2019-07-03 12:20:00": {
            "1. open": "137.2300",
            "2. high": "137.4650",
            "3. low": "137.1900",
            "4. close": "137.4400",
            "5. volume": "241906"
        },
}
}

Код, который я пробовал:

Питон

import json
with open("d:/Python Projects/myjason3.json") as f:
    j1 = json.load(f)

    for data in j1['Time Series (5min)']:

        print([data]['1. open'])

Я хочу напечатать значение ключа «1.open» под каждым значением временного ряда, например «2019-07-03 13:05:00». Я получаю ошибку:

 print([data]['1. open'])
TypeError: list indices must be integers or slices, not str
0
gages road 4 Июл 2019 в 09:24

3 ответа

Лучший ответ

Первая ошибка возникает в квадратных скобках data: print(data['1. open']).

[data] создает список только из одного элемента, data, а вы хотите получить прямой доступ к словарю data.

Кроме того, вы перебираете словарь, который выдает ключи, а не значения; попробуйте с: for data in j1['Time Series (5min)'].values():

1
Francis Colas 4 Июл 2019 в 06:31

for data in j1['Time Series (5min)']: будет перебирать ключи (даты) вашего запроса, а не фактические данные.

[data]['1. open'] преобразуется (т.е. в первой итерации) в ["2019-07-03 13:05:00", ]['1. open'], поэтому вы пытаетесь получить доступ к списку строк (["2019-07-03 13:05:00", ]) по ключу ('1. open').

Чтобы перебрать ключи и значений в стиле dict, Python использует dict.items() api:

import json
with open("d:/Python Projects/myjason3.json") as f:
    j1 = json.load(f)
    for datetime_key, data in j1['Time Series (5min)'].items():
        print(data['1. open'])
0
Hrabal 4 Июл 2019 в 06:35

Вы не ссылаетесь на словарь данных должным образом. Вы должны иметь возможность перебирать ключевые значения 'Time Series (5min)' следующим образом:

for timestamp, values in j1['Time Series (5min)'].items():
    print(timestamp, values['1. open'])

1
monkut 4 Июл 2019 в 06:30